二叉树的基本操作(简单易懂)

二叉树基本操作

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;
}
posted @ 2018-11-13 15:49  ChunhaoMo  阅读(5710)  评论(0编辑  收藏  举报