一、定義
二叉樹是一種樹形結構,他的特點是每個節點之多隻有兩顆子樹,並且二叉樹有左右之分,其次不能任意點到。
二、性質
1、性質1
二叉樹的第i層上最多有2 i-1個結點(i>=1)。
性質2
在一棵深度爲k的二叉樹中,最多有2^k-1個結點,最少有k個結點。
性質3
在一棵二叉樹中,如果葉子結點的個數爲n0,度爲2的結點個數爲n2,則n0=n2+1。
性質4
具有n個結點的完全二叉樹的深度爲⌊log2(n)⌋+1 。
性質5
對一棵具有n個結點的完全二叉樹中的結點從1開始按層序編號,則對於任意的編號爲i(1<=i<=n)的結點,有:
1.如果i = 1,則結點i是根結點,無雙親;如果i > 1,則結點i的雙親爲⌊i/2⌋;
2.如果2i > n,則結點i無左孩子;否則結點i的左孩子的編號爲2i。
3.如果2i+1 > n,則結點i無右孩子;否則結點i的右孩子的編號爲2i+1。
三、遍歷
先序遍歷(DLR):
首先訪問根,再先序遍歷左子樹,最後先序遍歷右子樹。如上圖遍歷的結果是:ABCDEGF
中序遍歷(LDR):
首先中序遍歷左子樹,再訪問根,最後中序遍歷右子樹,如上圖遍歷的結果是:CBEGDFA
後序遍歷(LRD):
首先後序遍歷左子樹,再後序遍歷右子樹,最後訪問根。如上圖遍歷的結果是:CGEFDBA
四、實現
#include<stdio.h>
#include<stdlib.h>
typedef char EleType;
typedef struct BiTNode{
EleType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//按先序遍歷方式遞歸創建二叉樹
bool createBitTree(BiTree *T){
EleType data;
scanf("%c",&data);
if('#' == data)
*T = nullptr;
else{
(*T) = (BiTree)malloc(sizeof(BiTNode));
if(!(*T)){
exit(-1);
}
(*T)->data = data;
createBitTree(&(*T)->lchild);//創建左子樹
createBitTree(&(*T)->rchild);//創建右子樹
}
return true;
}
void visite(EleType data){
printf("%c",data);
}
//遞歸實現先序遍歷二叉樹
bool proOrderTraverse(BiTree &T){
if(T == nullptr)
return false;
visite(T->data);
proOrderTraverse(T->lchild);
proOrderTraverse(T->rchild);
return true;
}
//遞歸實現中序遍歷二叉樹
bool inOrderTraverse(BiTree &T){
if(T == nullptr)
return false;
inOrderTraverse(T->lchild);
visite(T->data);
inOrderTraverse(T->rchild);
return true;
}
//遞歸實現後序遍歷二叉樹
bool postOrderTraverse(BiTree &T){
if(T == nullptr)
return false;
postOrderTraverse(T->lchild);
postOrderTraverse(T->rchild );
visite(T->data);
return true;
}
//ABC##DE#G##F###
int main(){
BiTree T;
createBitTree(&T);
proOrderTraverse(T);
printf("\n");
inOrderTraverse(T);
printf("\n");
postOrderTraverse(T);
getchar();
return 0;
}
輸出結果:
ABC##DE#G##F###
ABCDEGF
CBEGDFA
CGEFDBA