二叉樹的基本操作(簡單易懂)


二叉樹基本操作

1.初始化
2.建樹
3.銷毀樹
4.插入操作
5.查找元素值為e的節點的指針
6.查找元素值為e的節點左節點的值
7.查找元素值為e的節點右節點的值
8.刪除左子樹
9.刪除右子樹
10.先序遍歷
11.中序遍歷
12.后序遍歷
13. 計算葉子節點數
14.計算非葉子節點數
15.計算樹的深度

我輸入的樹按先序輸入

ABC##D##EF#G##HI###

代碼

#include<bits/stdc++.h>
using namespace std;
const int maxsize=1000; 
typedef struct Node{
	char date;
  struct Node *lchild;
	struct Node *rchild;
}*BiTree,BitNode;
void InitBitree(BiTree *T){
	*T=NULL;
}
void DestroyBitree(BiTree *T){
	if(*T){
		if((*T)->lchild)
		DestroyBitree(&((*T)->lchild));
		if((*T)->rchild)
		DestroyBitree(&((*T)->rchild));
		free(*T);
		*T=NULL;
	}
}
void CreateBitree(BiTree *T){
	char ch;
	cin>>ch;
	if(ch=='#') *T=NULL;
	else{
		*T=(BiTree)malloc(sizeof(BitNode));//生成根節點
		if(!(*T))
			exit(-1);
		(*T)->date=ch;
		CreateBitree(&((*T)->lchild));//遞歸創建左右子樹 
		CreateBitree(&((*T)->rchild));
	}
}
bool InsertLeftchild(BiTree p,BiTree c)//將c插入T,c作為p的左子樹
{
	if(p){
		c->lchild=p->lchild;
		p->lchild==c;
		return 1;
	} 
	return 0;
} 
bool InsertRightchild(BiTree p,BiTree c){//將c插入T,c作為p的右子樹
	if(p){
		c->rchild=p->rchild;
		p->rchild=c;
		return 1;
	} 
	return 0;
}
BitNode *Point(BiTree T,char e)//查找元素值為e的節點的指針
{
	BiTree q[maxsize];//創建空隊列 
	int front=0,rear=0;
	BitNode *p;
	if(T){//如果樹非空 
		q[rear]=T;
		rear++;
		while(front!=rear){//如果隊列非空 
			p=q[front];
			front++;
			if(p->date==e) return p;
			if(p->lchild){
				q[rear]=p->lchild;
				rear++;
			}
			if(p->rchild){
				q[rear]=p->rchild;
				rear++;
			}
		}
	} 
	return NULL;
}
char LeftChild(BiTree T,char e){//查找元素值為e的節點左節點的值 
	BiTree p;
	if(T){
		p=Point(T,e);
	if(p&&p->lchild) return p->lchild->date;
	}
	//return;
} 
char RightChild(BiTree T,char e){//查找元素值為e的節點右節點的值 
	BiTree p;
	if(T){
		p=Point(T,e);
		if(p&&p->rchild) return p->rchild->date;
	}
	//return ;
}
bool DelectLeftChild(BiTree p){//刪除左子樹 
	if(p){
		DestroyBitree(&(p->lchild));
		return 1;
	}
	return 0;
}
bool DelectRightChild(BiTree p){//刪除右子樹 
	if(p){
		DestroyBitree(&(p->rchild));
		return 1;
	}
	return 0;
} 
//二叉樹的遍歷(遞歸地遍歷),先序(根左右),中序(左根右),后序(左右根) 
void PreOrderTraverse(BiTree T){
	if(T){
		printf("%2c",T->date);
		PreOrderTraverse(T->lchild);
		PreOrderTraverse(T->rchild);
	}
} 
void InOrderTraverse(BiTree T){
	if(T){
		InOrderTraverse(T->lchild);
		printf("%2c",T->date);
		InOrderTraverse(T->rchild);
	}
}
void PostOrderTraverse(BiTree T){
	if(T){
		PostOrderTraverse(T->lchild);
		PostOrderTraverse(T->rchild);
		printf("%2c",T->date);
	}
}
int leafnum(BiTree T){//葉子節點數 
	if(!T) return 0;
	else if((!T->lchild)&&(!T->rchild)) return 1;
	else return leafnum(T->lchild)+leafnum(T->rchild);
} 
int Notleafnum(BiTree T){//非葉子節點數 
	if(!T) return 0;
	else if(!T->lchild&&!T->rchild) return 0;
	else return Notleafnum(T->lchild)+Notleafnum(T->rchild)+1;
}
int deapth(BiTree T){
	if(!T) return 0;
	else return deapth(T->lchild)>deapth(T->rchild)? deapth(T->lchild)+1:deapth(T->rchild)+1;
} 
int main(){
	BiTree T,root;
	//freopen("in.txt","r",stdin);
	InitBitree(&T);
	cout<<"According to the first order to create a binary tree\n";//按先序建樹 
	CreateBitree(&T);
	cout<<"First sequence traversal of binary tree is\n";//先序遍歷 
	PreOrderTraverse(T);
	cout<<endl; 
	cout<<"In the binary tree traversal is\n";//中序遍歷 
	InOrderTraverse(T);
	cout<<endl;
	cout<<"After the binary tree traversal is\n";//后序遍歷 
	PostOrderTraverse(T);
	cout<<endl;
	cout<<"E's leftChild is"<<' '<<LeftChild(T,'E')<<endl;//E的左兒子 
	cout<<"E's RightChild is"<<' '<<RightChild(T,'E')<<endl;//E的右兒子
	cout<<"The tree's leafnumber is "<<leafnum(T)<<endl;//葉子節點數 
	cout<<"The tree's notleafnumber is "<<Notleafnum(T)<<endl;//非葉子節點數 
	cout<<"The tree's deapth is "<<deapth(T)<<endl;//樹的深度 
	DelectLeftChild(T)?cout<<"Delection is success\n":"Delection is fail\n";//刪除樹的左子樹 
	//刪除后看一下里面的什么情況
	cout<<"First sequence traversal of binary tree is\n";//先序遍歷 
	PreOrderTraverse(T);
	cout<<endl; 
	cout<<"In the binary tree traversal is\n";//中序遍歷 
	InOrderTraverse(T);
	cout<<endl;
	cout<<"After the binary tree traversal is\n";//后序遍歷 
	PostOrderTraverse(T);
	cout<<endl; 
	cout<<"The tree's leafnumber is "<<leafnum(T)<<endl;//葉子節點數 
	cout<<"The tree's notleafnumber is "<<Notleafnum(T)<<endl;//非葉子節點數 
	cout<<"The tree's deapth is "<<deapth(T)<<endl;//樹的深度 
	return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM