二叉树总结

来源:互联网 发布:mac luajit 安装 编辑:程序博客网 时间:2024/06/15 16:31

 二叉树总结就由引入该图开始。


一般来说,关于二叉树算法都是由定义的结构体开始的。

结构体定义分为三个结构,一个数据域,一个左孩子指针和一个右孩子指针,借助于结构体,就可以对二叉树进行各种操作。

————————————————————————————————————————————————————————


首先,根据这个二叉树,我们可以知道根节点A,将其地址设为根节点T。那么,T的类型就可以写为:BiNode *T或BiTree T。根节点的数据即T->data。左孩子节点B的数据即T-lchild,节点C的数据是T->lchile->lchile。

————————————————————————————————————————————————————————


二叉树的建立:

①先序遍历建立二叉树

建立二叉树,我们可以想到一棵树,我们只有从根部开始,沿着根部找啊找,找到其他子树。

所以二叉树也是如此,我们找到根节点T,从根节点开始往下找这棵树的左右子树。

由这个思路,我们即想到了递归算法

例如:现在我们已经知道图示的二叉树,按先序序列读入字符的顺序为:ABC@@DE@G@@F@@@(@表示空树)

递归体: 要注意,最后要返回根节点。

②根据先(后)序和中序建立二叉树

现以 先序序列:abdegcf

中序序列:dbgeafc为例,建立二叉树。

我们根据先序和中序来确定一个二叉树,不用代码写,你可以简单的画出这个二叉树,但是现在我们要用编程的思维来画出这个二叉树,我们需要做的就是理解怎么来建这个二叉树,要根据先序、中序确定这棵二叉树的根、左子树、右子树。还要知道左子树和右子树的位置和个数。

同样的如上,我们想到的就是利用递归做,用数组把先序和中序序列存起来。

先序序列pre[] 中序序列in[]先序起始下标pp 中序起始下标ip个数n

图中有几处省略,sizeof(BiTNode)、creat(pre,in,pp+1,ip,i)。

for循环的作用就是利用前序与中序比较是否相等,如果相等则i++,i最后的值就代表了子树的个数。

————————————————————————————————————————————————————————


二叉树的遍历: 非线性->线性

①前序遍历:根、左、右

若以上图二叉树为例,则该二叉树的前序序列即ABCDEGF

void PreOrderTraverse(BiTree T){

if(T){

cout<<T->data;

PreOrderTraverse(T->lchild);

PreOrderTraverse(T->rchild);

}

}

②中序序列:左、根、右

若以上图二叉树为例,则该二叉树的中序序列即CBEGDFA

void InOrderTraverse(BiTree T){

if(T){

InOrderTraverse(T->lchild);

cout<<T->data;

InOrderTraverse(T->rchild);

}

}

③后序序列:左、右、根

若以上图二叉树为例,则该二叉树的后序序列即CGEFDBA

void PostOrderTraverse(BiTree T){

if(T){

PostOrderTraverse(T->lchild);

PostOrderTraverse(T->rchild);

cout<<T->data;

}

}

④层次遍历:从上到下,从左到右

void postorder(BiTree T){
int rear=1,front=0;
BiTree p[51];
p[0]=T;
while(rear>front){
if(p[front]){
printf("%c",p[front]->data);
p[rear++]=p[front]->lchild;
p[rear++]=p[front]->rchild;
front++;
}
else
front++;
}
}

利用数组模拟队列(先进先出)。

————————————————————————————————————————————————————————

二叉树的深度:

如果是空树,递归结束,深度为0,否则:递归计算左子树的深度记为m;递归计算右子树的深度记为n;如果m大于n,二叉树深度为m+1,否则为n+1。

int Depth(BiTree T){
int n,m;
if(T==NULL)
return 0;
else{
m=Depth(T->lchild);
n=Depth(T->rchild);
if(m>n)
return (m+1);
else
return (n+1);
}
}

————————————————————————————————————————————————————————

二叉树叶子节点数目的统计: count初始值为0

void leaves(BiTree T)
{
    if(T!=NULL)
    {
        if(T->lchild==NULL&&T->rchild==NULL)
        {
            count++;
        }
        leaves(T->lchild);
        leaves(T->rchild);
    }
}

————————————————————————————————————————————————————————

原创粉丝点击