实现二叉树的基本操作:建立、遍历、计算深度、结点数、叶子数等。
输入C,先序创建二叉树,#表示空节点;
输入H:计算二叉树的高度;
输入L:计算二叉树的叶子个数;
输入N:计算二叉树节点总个数;
输入1:先序遍历二叉树;
输入2:中序遍历二叉树;
输入3:后续遍历二叉树;
输入F:查找值=x的节点的个数;
输入P:以缩格文本形式输出所有节点。
例如:
输入 | Result |
---|---|
C ABC##DE#G##F### H L N 1 2 3 F A P | Created success! Height=5. Leaf=3. Nodes=7. Preorder is:A B C D E G F . Inorder is:C B E G D F A . Postorder is:C G E F D B A . The count of A is 1. The tree is: A B C D E G F |
#include<bits/stdc++.h>
//typedef long long ll;
//typedef unsigned long long ull;
using namespace std;
typedef struct node
{
char data;
struct node *lchild,*rchild;
}*BiTree,BiTnode;
void creattree(BiTree &tree)//创建树
{
char ch;
cin>>ch;
if(ch=='#')tree=NULL;
else
{
tree=new BiTnode;
tree->data=ch;
creattree(tree->lchild);
creattree(tree->rchild);
}
};
void PreOrder(BiTree tree)//前缀
{
if(tree)
{
cout<<tree->data<<" ";
PreOrder(tree->lchild);
PreOrder(tree->rchild);
}
}
void InOrder(BiTree tree)//中缀
{
if(tree)
{
InOrder(tree->lchild);
cout<<tree->data<<" ";
InOrder(tree->rchild);
}
}
void PostOrder(BiTree tree)//后缀
{
if(tree)
{
PostOrder(tree->lchild);
PostOrder(tree->rchild);
cout<<tree->data<<" ";
}
}
int depth(BiTree tree)//深度
{
if(tree==NULL)return 0;
else
{
int dl=depth(tree->lchild),dr=depth(tree->rchild);
if(dl>dr)return dl+1;
else return dr+1;
}
}
int NodesNum(BiTree tree)//节点数
{
if(tree==NULL)return 0;
else return NodesNum(tree->lchild)+NodesNum(tree->rchild)+1;
}
int LeafNum(BiTree tree)//叶子数
{
if(tree==NULL)return 0;
else if(tree->lchild==NULL&&tree->rchild==NULL)return 1;
else return LeafNum(tree->lchild)+LeafNum(tree->rchild);
}
void findnode(BiTree tree,char x,int &sum)//计算值为x结点个数
{
if(tree)
{
if(tree->data==x)
{
sum++;
findnode(tree->lchild,x,sum);
findnode(tree->rchild,x,sum);
}
else
{
findnode(tree->lchild,x,sum);
findnode(tree->rchild,x,sum);
}
}
}
void output(BiTree &tree,int layer)//打印图形
{
if(tree)
{
for(int i=1;i<layer;i++)cout<<" ";
cout<<tree->data<<endl;
output(tree->lchild,layer+1);
output(tree->rchild,layer+1);
}
}
void done(BiTree &tree)
{
int sum=0;char ch,c;
getchar();
creattree(tree);
cout<<"Created success!"<<endl;
while(1)
{
cin>>c;
switch (c)
{
case 'H':
cout<<"Height="<<depth(tree)<<'.'<<endl;
break;
case 'L':
cout<<"Leaf="<<LeafNum(tree)<<'.'<<endl;
break;
case 'N':
cout<<"Nodes="<<NodesNum(tree)<<'.'<<endl;
break;
case '1':
cout<<"Preorder is:";
PreOrder(tree);
cout<<'.'<<endl;
break;
case '2':
cout<<"Inorder is:";
InOrder(tree);
cout<<'.'<<endl;
break;
case '3':
cout<<"Postorder is:";
PostOrder(tree);
cout<<'.'<<endl;
break;
case 'F':
cin>>ch;
findnode(tree,ch,sum);
cout<<"The count of "<<ch<<" is "<<sum<<'.'<<endl;
break;
case 'P':
cout<<"The tree is:"<<endl;
output(tree,1);exit(0);
break;
}
}
};
int main()
{
BiTree T;done(T);
return 0;
}