二叉树的基本性质:
<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;
}

举例:
二叉树及其遍历方式
二叉树及其遍历方式
对应的二叉树图为:
二叉树及其遍历方式
下一篇将会讲已知二叉树的一种遍历序列怎么推出整个二叉树。

相关文章: