其他分享
首页 > 其他分享> > 树

作者:互联网

有根树

基本概念

  1. 如果一棵树有一个名为"根"的节点,那么它是一棵有根树。
  2. 有根树的节点之间具有父子关系,没有父亲节点的是根节点,没有儿子节点的是叶节点。
  3. 一个节点的深度是它与根节点之间的距离。

有根树的表达

有根树的表达可以用左子右兄弟表示法,这种表示法中各节点具有如下信息:

  1. 节点 u 的父亲节点
  2. 节点 u 最左侧的儿子节点
  3. 节点 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