本习题为二叉树的基本运算练习,要求依次实现如下功能:
1.输入一个使用“括号表示法”表示的二叉树,每个节点的数据为一个字符,请使用二叉链的存储方式构建二叉树B。
2.使用中序遍历法遍历构建的二叉树,输出中序遍历的序列。
3.输出该二叉树的高度(深度),其中,根节点作为第1层。
4.计算该二叉树中所有叶子节点的个数。
5.将该二叉树的左右子树进行交换,生成一个新的二叉树T。
6.将新生成的二叉树 T 使用括号表示法表示,并输出该括号表示法的结果。
输入格式:
输入一个不带空格的字符串,以换行结尾。
输出格式:
“中序遍历”输出的节点数据使用空格进行分隔,最后一个输出后允许有空格;
输出的二叉树的高度为一个十进制整型,单独一行输出;
二叉树的叶子节点个数为一个十进制整型,单独一行输出;
最后输出交换左右子树的二叉树T的括号表示法,使用一个不带空格的字符串表示输出
#include<iostream>
using namespace std;
struct tree
{
char root;
tree *l;
tree *r;
};
void create(tree *&t,char s[])
{
char temp;
tree *stack[50],*p;
int top = -1, k=0, j = 0;
while( (temp = s[j++]) != '\0' )
{
switch(temp)
{
case '(':
top++;
stack[top]=p;
k = 1;
break;
case ',':
k = 2;
break;
case ')':
top--;
break;
default:
p=(struct tree*)malloc(sizeof(tree));
p->root = temp;
p->l = p->r = NULL;
if(t==NULL )
t=p;
else
{
switch(k)
{
case 1:
stack[top]->l=p;
break;
case 2:
stack[top]->r=p;
break;
}
}
}
}
}
void m( tree *t)
{
while(t)
{
m(t->l);
cout<<t->root<<" ";
m(t->r);
break;
}
}
int Depth(tree *root)
{
if(root!=NULL)
{
int l=Depth(root->l);
int r=Depth(root->r);
if(l>r)
{
return l+1;
}
else
return r+1;
}
else
return 0;
};
int flag=0;
int Leafcount(tree *t)
{
if(t)
{
if(t->l==NULL && t->r==NULL)
flag++;
else
{
Leafcount(t->l);
Leafcount(t->r);
}
}
return flag;
}
void exchang(tree *t)
{
tree *temp = new tree();
if (t)
{
temp = t->r;
t->r = t->l;
t->l =temp;
exchang(t->l);
exchang(t->r);
}
else
{
return;
}
}
void PrinTree(tree *t)
{
if( t )
{
cout << t->root; //访问根节点
if( t->l != NULL || t->r != NULL )
{
cout << "(";
PrinTree(t->l); //递归处理左子树
if(t->r != NULL)
cout << ",";
PrinTree(t->r); //递归处理右子树
cout << ")";
}
}
}
int main()
{
char a[100];
cin>>a;
tree *t=NULL;
create(t,a);
m(t);
cout<<endl;
cout<<Depth(t);
cout<<endl;
cout<<Leafcount(t);
cout<<endl;
exchang(t);
PrinTree(t);
}