遞歸實現二叉樹的創建和遍歷

一、定義

    二叉樹是一種樹形結構,他的特點是每個節點之多隻有兩顆子樹,並且二叉樹有左右之分,其次不能任意點到。
在這裏插入圖片描述

二、性質

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章