二叉树基本操作
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;
}