树的基本概念与二叉树相关

基本概念:(双亲,兄弟,堂兄弟等不在这里赘述)
结点(node):包含一个数据元素及若干指向其子树的分支
结点的度(degree):结点拥有子树的个数
树的度:树中所有结点的度的最大值
叶子结点(leaf):度为0的结点
 
二叉树的性质:
 
1.在二叉树的第i层至多有2^(i-1)个结点
example
            1
        2       3
    4      5 6      7
  ** 第2层有2^1
  ** 第3层有2^4
2.深度为k的二叉树至多有2^k-1个结点
example:
    如上二叉树:深度为3 总共2^3-1=7个node
3.对于任意一个二叉树T,若终端结点为n0,度为2的结点数为n2,n0=n2+1;
example:
    如上二叉树:终端结点4,度数为2的结点n2=3

**完全二叉树:  1.所有叶子结点只能出现在层号最大的两层上; 2.对任意节点,若其右子树的层高为k,左子树必为k或k+1;

4.具有n个结点的完全二叉树的深度为[log2(n)]+1

5.对于具有n个结点的完全二叉树,如果按照对满二叉树的方式进行顺序编号,对于任意序号为i的结点有:
    1)i=1; 结点i为root,无parent;i>1则parent=i/2
    2) 2i<=n; 结点i的左孩子结点序号为2i否则无左孩子
    3)2i+1<=n;结点i的右孩子结点序号为2i+1否则无右孩子



二叉树的存储:
    1.对于满二叉树以及完全二叉树的适合存储(顺序存储结构)
        由性质5我们可以将标号为i的左孩子下标为2i,右孩子下标为2i+1,双亲的结点下标为[i/2];
    二叉树的存储结构定义:
1     #define MAX 100
2     typedef struct{
3         int Sqsitree[MAX+1];      //0号单元不用
4         int nodemax;               //数组中最后一个节点的下标
5     }Bitree;

 

    2.适用于所有二叉树的存储(链式存储结构)
    我们可以如下定义:
    _________________
    |Lchild | Data |Rchild|
   
描述如下:

typedef struct node{
    int data;
    struct node* Lchild;
    struct node* Rchild;
}sitnode,*Sitree;

 

同样当我们需要父母时也可以加上parent,组成三叉链表


二叉树的遍历:
1.递归实现:
A、先序遍历:root->left->right
B、中序遍历:left->root->right
C、后序遍历:right->left->root

void FreOrder(Bitree root)
{
    if(root)
    {
        Visit(root->data);
        FreOrder(root->Lchild);
        FreOrder(root->Rchild);
    }
}

 

//中序遍历和后序遍历只是修改访问root数据的顺序

2.非递归实现
先序遍历的实现:
1)访问root,root入栈并进入其左子树,进而访问左子树的root并入栈,在进入下一层左子树,...直到为空
2)栈非空则从栈顶退出上一层的结点,并进入该节点的右子树

 1 void PreOrder(Bitree root){
 2     Seqstack *s;
 3     Bitree p;
 4     InitStack(S);
 5     p=root;
 6     while(p!=NULL||!IsEmpty(s))
 7     {
 8         while(p!=NULL)
 9         {
10             Visit(p->data);
11             Push(S,p);
12             p=p->Lchild;
13         }
14         if(!IsEmpty(S)){
15             Pop(S,p);
16             p=p->Rchild;
17         }
18     }
19 }

 

中序遍历只是调换了data的访问位置

后序遍历:
1.当前结点进栈,并进入其左子树,重复至当前结点为空;
2.若栈非空,判断栈顶结点P的右子树是否为空,右子树是否访问过,是则退栈
 1 void PostOrder(Bitree root)
 2 {
 3     SeqStack *s;
 4     Sitree p,q;
 5     InitStack(s);
 6     p=root;
 7     q=NULL;
 8     while(p!=NULL||!IsEmpty(S))
 9     {
10         while(p!=NULL);
11         {
12             push(s,p);
13             p=p->Lchild;
14         }
15         if(!IsEmpty(s))
16         {
17             Top(s,&p);
18             if((p->Rchild==NULL)||(p->Rchild==q))
19             {
20                 Pop(s,p);
21                 Visit(P->data);
22                 q=p;
23                 p=NULL;
24             }
25             else
26                 p = p-> Rchild;
27         }
28     }
29 
30 }

//以上是我用一小时对二叉树的复习,其中运用栈的地方,读者可以自行定义变化。

上面仅是博主的自己复习的内容,如果有用,感谢支持,如有不足,请大佬指正!

posted @ 2021-11-03 21:40  可乐最不懂  阅读(170)  评论(0)    收藏  举报