二叉树的基本性质:
<1>.第i层最多有2的i-1次方个节点(i>=1)。
<2>.如果二叉树有k层,则总共最多有2的k-1个节点(k>=1)。
<3>.若二叉树按从上到下从做到右依次编号,某节点编号为k,则其子节点编号分别为2k和2k+1.
<4>.若二叉树有k层,除第k层外,其它各层都达到最大个数,第k层的节点都集中在左边,这样的二叉树叫做完全二叉树。若第k层有2的k-1次个节点,则这样的二叉树叫做满二叉树。完全二叉树不一定是满二叉树,满二叉树一定是完全二叉树。
二叉树遍历:
就拿上图的二叉树来说。
遍历结果:
先序遍历:ABDECFG
中序遍历:DBEAFCG
后序遍历:DEBFGCA
按照不同的规则遍历就组成了不同的遍历序列,遍历的规则如下:
先序遍历:
根节点->左子树->右子树
中序遍历:
左子树->根节点->右子树
后序遍历:
左子树->右子树->根节点
实现的代码(以先序遍历的方式创建):
#include<stdio.h>
#include<stdlib.h>
/*二叉树链表实现
*
*/
typedef int ElemType;
typedef struct BitNode{//二叉树的存储结构
ElemType data;
int id;
int level;
struct BitNode *lchild,*rchild;
}BitNode,*BitTree;
//创建二叉树
void CreateBitree(BitTree *T,int level,int id){
ElemType ch;
scanf("%d",&ch);
if(ch==123){//以123为结束
*T=NULL;
}
else{
*T =(BitTree)malloc(sizeof(BitNode));
(*T)->data=ch;
(*T)->level=level;
(*T)->id=id;
CreateBitree(&(*T)->lchild,level+1,id*2);
CreateBitree(&(*T)->rchild,level+1,id*2+1);
}
}
/*先序遍历*/
void PreOrderTraverse(BitTree T){
if(T==NULL){
return;
}
printf("data:%d\tlevel:%d\tID:%d\n",T->data,T->level,T->id);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
//中序遍历
void InOrderTraverse(BitTree T){
if(T==NULL){
return;
}
InOrderTraverse(T->lchild);
printf("data:%d\tlevel:%d\tID:%d\n",T->data,T->level,T->id);
InOrderTraverse(T->rchild);
}
//后序遍历
void PostOrderTraverse(BitTree T){
if(T==NULL) return;
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("data:%d\tlevel:%d\tID:%d\n",T->data,T->level,T->id);
}
int main(){
printf("以先序遍历的方式创建二叉树:\n");
BitTree T=NULL;
CreateBitree(&T,1,1);
printf("先序遍历:\n");
PreOrderTraverse(T);
printf("中序遍历:\n");
InOrderTraverse(T);
printf("后序遍历:\n");
PostOrderTraverse(T);
return 0;
}
举例:
对应的二叉树图为:
下一篇将会讲已知二叉树的一种遍历序列怎么推出整个二叉树。