首页 > 代码库 > 树和二叉树

树和二叉树

 

:n(n≥0)个结点的有限集。

在任一棵非空树中: 1.有且仅有一个特定称为根的结点 2.n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,…,Tn,Ti称为树的子树。

树的性质: 递归性 层次性

基本术语: 树的结点:数据元素及若干指向其子树的分支

       叶子(终端结点):度(分支的个数)为零的结点

      分支结点(非终端结点):度大于零的结点

      结点的度:分支的个数  

      树的度:树中所有结点的度的最大值

      树的深度(高度):树中叶子结点所在的最大层次

      孩子(结点):结点子树的根称为该结点的孩子

      祖先(结点) :从根到该结点所经分支上的所有结点。

      子孙(结点) :以某结点为根的子树的任一结点

      兄弟(结点) :同一双亲的孩子互称兄弟。

      堂兄弟(结点) :双亲在同一层的结点互称堂兄弟

      有序树:树中结点的各子树从左到右有次序(不能互换)。

      无序树:树中结点的各子树从左到右无次序(能互换)。

      森林:m(m≥0)棵互不相交的树的集合

 

二叉树递归定义:由n(n>=0)个结点的有限集合,或为空集,或由一个根结点及两棵互不相交的左右子树组成,并且左右子树都是二叉树。

二叉树的五种不同形态:

二叉树的性质:(证明过程略)

性质1:在二叉树的第i层上至多有2i-1个结点(i>=1)。

性质2:深度为k的二叉树至多有2k-1个结点(k>=1).

性质3:对任一棵二叉树,若其终端结点数为n0,度为2的结点数为n2,则n0=n2+1。

性质4:有n个结点的完全二叉树的深度为log2n +1

满二叉树:一棵深度为k且有2k-1个结点的二叉树。

完全二叉树:若深度为k、有n个结点的二叉树中各结点能与深度为k的顺序编号的满二叉树编号从1到n的结点相对应。 所有的叶结点都出现在第k层或k-1层。 若任一结点右子树最大层次为l,其左子树最大层次为1或l+1。

二叉树的存储结构:(1)顺序储存结构

          (2)链式储存结构

以下代码实现采取链式储存结构

  1 #include<stdio.h>  2 #include<stdlib.h>  3       4 #define OK 1  5 #define ERROR -1  6 #define OVERFLOW -2  7    8           9 typedef int TElem; 10 typedef int Status; 11      12 typedef struct BiTNode 13 { 14     TElem data; 15     struct BiTNode *lchild,*rchild;  //左右孩子指针  16 } BiTNode,*BiTree; 17  18 /***函数原型**/ 19 Status CreateBiTree(BiTree &T); 20 //安先序次序输入二叉树中结点值,空格字符表示空树,构造二叉树表表示的二叉树T 21 Status PreOrderTraverse(BiTree T,Status(*visit)(TElem e)); 22 //采用二叉树表储存结构,visit是对应结点操作的应用函数 23 //先序遍历二叉树T,对每个结点调用函数visit一次且仅一次  24 //一旦visit()失败,则操作失败 25 Status InorderTraverse(BiTree T,Status(*visit)(TElem e)); 26 //中序遍历二叉树T,对每个结点调用函数visit一次且仅一次 27 Status PostOrderTraverse(BiTree T,Status(*visit)(TElem e)); 28 //后序遍历二叉树T,对每个结点调用函数visit一次且仅一次 29 void visit(TElem e); 30 //输出 31   32 void visit(TElem e) 33 { 34     printf("%d ",e);     35 }  36  37 Status CreateBiTree(BiTree *T) 38 { 39     TElem e; 40     scanf("%d",&e); 41      42     if(e==0) 43     { 44           *T=NULL; 45     } 46      47     else 48         { 49                 *T = (BiTree) malloc(sizeof(BiTNode)); 50                 if (!T) 51                 { 52                  exit(OVERFLOW); 53                  } 54             (*T)->data =http://www.mamicode.com/ e; 55             CreateBiTree(&(*T)->lchild);    //创建左子树 56             CreateBiTree(&(*T)->rchild);    //创建右子树 57     } 58     return 0; 59 }  60  61 Status PreOrderTraverse(BiTree T,void(*visit)(TElem))  62 { 63      64     if(T) 65     { 66         visit(T->data);  67         PreOrderTraverse(T->lchild,visit); 68         PreOrderTraverse(T->rchild,visit); 69  70     } 71     else return OK; 72 } 73  74  75 Status InOrderTraverse(BiTree T,void(*visit)(TElem)) 76 { 77     if(T) 78     { 79         InOrderTraverse(T->lchild,visit); 80         visit(T->data); 81         InOrderTraverse(T->rchild,visit); 82     }     83      84 } 85  86 Status PostOrderTraverse(BiTree T,void (*visit)(TElem)) 87 { 88     if(T) 89     { 90         PostOrderTraverse(T->lchild,visit); 91         PostOrderTraverse(T->rchild,visit); 92         visit(T->data); 93     } 94 }  95  96 int main() 97 { 98     BiTree T; 99     100     printf("创建一个树,输入0为空数");101     CreateBiTree(&T);102     printf("先序遍历:");103         PreOrderTraverse(T, *visit);104         printf("\n中序遍历:");105        InOrderTraverse(T, *visit);106        printf("\n后序遍历:");107        PostOrderTraverse(T, *visit);108        printf("\n"); 109 }

 

树和二叉树