树
作者:互联网
有根树
基本概念
- 如果一棵树有一个名为"根"的节点,那么它是一棵有根树。
- 有根树的节点之间具有父子关系,没有父亲节点的是根节点,没有儿子节点的是叶节点。
- 一个节点的深度是它与根节点之间的距离。
有根树的表达
有根树的表达可以用左子右兄弟表示法,这种表示法中各节点具有如下信息:
- 节点 u 的父亲节点
- 节点 u 最左侧的儿子节点
- 节点 u 右侧最紧邻的兄弟节点
这可以用三个数组或者一个结构体数组来实现。
struct tree{
int p;
int l;
int r;
};
各节点深度可以由如下算法求得。
void setDepth(int u,int d){
depth[u] = d;
if(t[u].r != NIL) setDepth(t[u].r,d);
if(t[u].l != NIL) setDepth(t[u].l,d+1);
}
二叉树
基本概念
二叉树就是儿子节点最多两个的有根树。
二叉树的表达
由于二叉树的一个节点最多只会有两个儿子节点,因此在结构体中只要表示出父亲节点和左右儿子即可。
struct tree{
int p = NIL;
int l = NIL;
int r = NIL;
};
获得二叉树的节点的一些基本信息的算法如下:
获得每个节点的深度
void setDepth(int u,int d){
depth[u] = d;
if(t[u].l != NIL) setDepth(t[u].l,d+1);
if(t[u].r != NIL) setDepth(t[u].r,d+1);
}
获得每个节点的高度
int setHeight(int u){
if(t[u].l == NIL && t[u].r == NIL)return 0;
int lh = 0,rh = 0;
if(t[u].l != NIL)lh = setHeight(t[u].l);
if(t[u].r != NIL)rh = setHeight(t[u].r);
int h = max(lh,rh)+1;
height[u] = h;
return h;
}
获得某个节点的兄弟节点
int getSibling(int u){
if(t[u].p == NIL) return NIL;
if(t[t[u].p].l == u){
return t[t[u].p].r;
}else{
return t[t[u].p].l;
}
}
二叉树的遍历
二叉树的遍历使用递归来实现,有三种方式,前序(preorder),中序(inorder),后序(postorder)。
前序遍历(根节点 -> 左子树 -> 右子树)
void preOrder(int u){
cout<<" "<<u;
if(t[u].l != NIL)preOrder(t[u].l);
if(t[u].r != NIL)preOrder(t[u].r);
}
中序遍历(左子树 -> 根节点 -> 右子树)
void inOrder(int u){
if(t[u].l != NIL)inOrder(t[u].l);
cout<<" "<<u;
if(t[u].r != NIL)inOrder(t[u].r);
}
后序遍历(左子树 -> 右子树 -> 根节点)
void postOrder(int u){
if(t[u].l != NIL)postOrder(t[u].l);
if(t[u].r != NIL)postOrder(t[u].r);
cout<<" "<<u;
}
标签:,NIL,int,二叉树,根树,节点,setDepth 来源: https://www.cnblogs.com/Softwarer1412/p/14726485.html