给定二叉树的中根序列和后根序列,请编写程序创建该二叉树,计算其高度和先根序列,最后删除该二叉树;如给定的中根和后根序列不合法,则亦能识别。
输入格式:
输入为两行字符串,第一行表示某二叉树的后根序列,第二行表示其中根序列。结点的值均为A-Z的大写字母,故二叉树结点个数不超过26,且保证输入的两个序列都是结点的全排列,但不一定是合法的中根和后根序列。
输出格式:
如果输入的序列不合法(不是同一棵树的中根序列和后根序列),则输出INVALID。若输入序列合法,输出为两行,第一行为一个整数,表示该二叉树的高度,第二行为一个字符串,表示该二叉树的先根序列。
输入样例1:
CEFDBHGA
CBEDFAGH
输出样例1:
3
ABCDEFGH
输入样例2:
CBEDFAGH
CEFDBHGA
输出样例2:
INVALID
输入样例3:
BCA
CAB
输出样例3:
INVALID
代码有点冗长感觉T_T 注意求树高那里减一,不能按之前学的来
#include <iostream>
using namespace std;
typedef struct Node {
char data;
struct Node *left, *right;
} Node, *Tree;
//递归判断序列是否合法,若合法,则左右子树结点个数和相应字符也应该相等
bool judge(string a, string b) {
if (a.length() == 0 && b.length() == 0)
return true;
if (a.length() != b.length())
return false;
char ch = a[a.length() - 1];
int i;
for (i = 0; i < b.length(); i++) {
if (ch == b[i])
break;
}
string aleft = a.substr(0, i);
string aright = a.substr(i, a.length() - 1 - i);
string bleft = b.substr(0, i);
string bright = b.substr(i + 1);
for (i = 0; i < aleft.length(); i++) {
if (bleft.find(aleft[i]) == -1)
return false;
}
for (i = 0; i < aright.length(); i++) {
if (bright.find(aright[i]) == -1)
return false;
}
return judge(aleft, bleft) && judge(aright, bright);
}
//建立二叉树
Tree create(char *post, char *in, int n) {
if (n < 1)
return NULL;
Tree tree = (Tree)malloc(sizeof(Node));
tree->data = post[n - 1];
tree->left = tree->right = NULL;
int i;
for (i = 0; i < n; i++) {
if (post[n - 1] == in[i])
break;
}
tree->left = create(post, in, i);
tree->right = create(post + i, in + i + 1, n - i - 1);
return tree;
}
//得到二叉树高度
int geth(Tree tree) {
if (!tree)
return 0;
int left = geth(tree->left);
int right = geth(tree->right);
return (left > right ? left : right) + 1;
}
//先序遍历
void preorder(Tree tree) {
if (!tree)
return;
printf("%c", tree->data);
preorder(tree->left);
preorder(tree->right);
}
//递归删除二叉树
void deletetree(Tree tree) {
if (!tree)
return;
deletetree(tree->left);
deletetree(tree->right);
free(tree);
}
int main() {
string a, b;
cin >> a >> b;
if (!judge(a, b))
printf("INVALID");
else {
int n = a.length();
char post[30], in[30];
int p = 0;
for (int i = 0; i < n; i++)
post[p++] = a[i];
p = 0;
for (int i = 0; i < n; i++)
in[p++] = b[i];
Tree tree = create(post, in, n);
printf("%d\n", geth(tree) - 1);//如果不减一,输出4,这个题应该是按照只有一个结点时,树高为0来的
preorder(tree);
deletetree(tree);
}
return 0;
}