#include<bits/stdc++.h>
using namespace std;
typedef int Status;
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
int Nodenum=0;
int Count=0;
Status CreateBiTree(BiTree &T){
char ch;
scanf("%c",&ch);
if(ch=='#')T=NULL;
else {
if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))exit(0);
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return 1;
}
Status PreOrderTraverse(BiTree T){
if(T){
printf("%c",T->data);
if(PreOrderTraverse(T->lchild))
if(PreOrderTraverse(T->rchild))
return 1;
return 0;
}else return 1;
}
Status InOrderTraverse(BiTree T){
int m=0;
if(T){
if(InOrderTraverse(T->lchild))m=1;
printf("%c",T->data);
if(m)
if(InOrderTraverse(T->rchild))return 1;
return 0;
}return 1;
}
Status PostOrderTraverse(BiTree T){
if(T){
if(PostOrderTraverse(T->lchild))
if(PostOrderTraverse(T->rchild)){
printf("%c",T->data);return 1;
}
return 0;
}
else return 1;
}
int Depth(BiTree T){
int leftDepth,rightDepth;
if(T==NULL)return 0;
else {
leftDepth =Depth(T->lchild);
rightDepth=Depth(T->rchild);
if(leftDepth>=rightDepth)return leftDepth+1;
else return rightDepth+1;
}
}
Status NodeCount(BiTree T){
if(T){
Nodenum++;
if(NodeCount(T->lchild))
if(NodeCount(T->rchild))return 1;
return 0;
}
else return 1;
}
Status LeafCount(BiTree T){
if(T){
if(T->lchild==NULL&&T->rchild==NULL){
printf("%c",T->data);Count++;
}
if(LeafCount(T->lchild))
if(LeafCount(T->rchild))
return 1;
}
else return 1;
}
Status ExchangeBiTree(BiTree &T){
BiTree p;
if(T){
if(T->lchild||T->rchild){
p=T->lchild;T->lchild=T->rchild;T->rchild=p;
}
if(ExchangeBiTree(T->lchild))
if(ExchangeBiTree(T->rchild))return 1;
return 0;
}
return 1;
}
Status CopyBiTree(BiTree T,BiTree &B){
if(T==NULL)
B=NULL;
else {
if(!(B=(BiTNode*)malloc(sizeof(BiTNode))))exit(0);
B->data=T->data;
CopyBiTree(T->lchild,B->lchild);
CopyBiTree(T->rchild,B->rchild);
}
return 1;
}
Status DestoryTree(BiTree &T){
if(T){
DestoryTree(T->lchild);
DestoryTree(T->rchild);
free(T);
}
return 1;
}
Status ClearTree(BiTree &T){
if(T){
T=NULL;
}
return 1;
}
int main(){
BiTree T,B;
cout<<"创建二叉树,按先序遍历输入:"<<endl;
CreateBiTree(T);
NodeCount(T);
cout<<"二叉树的节点个数为:"<<Nodenum<<endl;
cout<<"二叉树的深度为:"<<Depth(T)<<endl;
cout<<"先序遍历:"<<endl;
PreOrderTraverse(T);
cout<<endl;
cout<<"中序遍历"<<endl;
InOrderTraverse(T);
cout<<endl;
cout<<"后序遍历"<<endl;
PostOrderTraverse(T);
cout<<endl;
cout<<"叶子节点"<<endl;
LeafCount(T);
cout<<endl;
cout<<"叶子节点个数"<<Count<<endl;
cout<<"交换所有左右子树"<<endl;
ExchangeBiTree(T);
if(CopyBiTree(T,B)==1)cout<<"成功复制二叉树T到B"<<endl;
if(DestoryTree(T)==1)cout<<"成功销毁二叉树T"<<endl;
if(ClearTree(T)==1)cout<<"将二叉树T置为空树"<<endl;
cout<<"先序B"<<endl;
PreOrderTraverse(B);
cout<<endl;
cout<<"中序B"<<endl;
InOrderTraverse(B);
cout<<endl;
cout<<"后序B"<<endl;
PostOrderTraverse(B);
cout<<endl;
}
二叉树的一些递归算法总结
最新推荐文章于 2021-09-03 11:02:27 发布