本习题为二叉树的基本运算练习,要求依次实现如下功能:
- 输入一个使用“括号表示法”表示的二叉树,每个节点的数据为一个字符,请使用二叉链的存储方式构建二叉树B。
- 使用中序遍历法遍历构建的二叉树,输出中序遍历的序列。
- 输出该二叉树的高度(深度),其中,根节点作为第1层。
- 计算该二叉树中所有叶子节点的个数。
- 将该二叉树的左右子树进行交换,生成一个新的二叉树T。
- 将新生成的二叉树 T 使用括号表示法表示,并输出该括号表示法的结果。
输入格式:
输入一个不带空格的字符串,以换行结尾。
输出格式:
- “中序遍历”输出的节点数据使用空格进行分隔,最后一个输出后允许有空格;
- 输出的二叉树的高度为一个十进制整型,单独一行输出;
- 二叉树的叶子节点个数为一个十进制整型,单独一行输出;
- 最后输出交换左右子树的二叉树T的括号表示法,使用一个不带空格的字符串表示输出。
输入样例:
A(B(D(,G)),C(E,F))
输出样例:
D G B A E C F 4 3 A(C(F,E),B(,D(G)))
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Node{
char data;
struct Node *left , *right;
}*BT;
int cnt;
int cur;
int len;
char arr[1000];
BT Create(BT root);
void In(BT root);
int getHeight(BT root);
void Leaves(BT root);
void Print(BT root);
int main(){
gets(arr);
len = strlen(arr);
BT root = NULL;
root = Create(root);
In(root);printf("\n");
printf("%d\n" , getHeight(root));
Leaves(root);
printf("%d\n" , cnt);
Print(root);
return 0;
}
BT Create(BT root){
BT stack[1000];
int top = -1 , flag;
BT p , q;
while(cur < len){
switch (arr[cur]){
case '(':
stack[++top] = p;
flag = 1;
break;
case ')':
q = stack[top--];
break;
case ',':
flag = 2;
break;
default:
p = (BT)malloc(sizeof(struct Node));
p->data = arr[cur];
p->left = p->right = NULL;
if(!root){
root = p;
}else{
q = stack[top];
if(flag == 1){
q->left = p;
}else{
q->right = p;
}
}
break;
}
cur ++;
}
return root;
}
void In(BT root){
if(root){
In(root->left);
printf("%c ",root->data);
In(root->right);
}
}
int getHeight(BT root){
if(!root){
return 0;
}else{
return getHeight(root->left) > getHeight(root->right) ? getHeight(root->left) + 1 : getHeight(root->right) + 1;
}
}
void Leaves(BT root){
if(root){
if(!root->left && !root->right){
cnt ++;
}else{
Leaves(root->left);
Leaves(root->right);
}
}
}
void Print(BT root){
if(root){
printf("%c" , root->data);
if(root->left || root->right){
printf("(");
Print(root->right);
if(root->left){
printf(",");
}
Print(root->left);
printf(")");
}
}
}