给定二叉树的中根序列和后根序列,请编写程序创建该二叉树,计算其高度和先根序列,最后删除该二叉树;如给定的中根和后根序列不合法,则亦能识别。
输入格式:
输入为两行字符串,第一行表示某二叉树的后根序列,第二行表示其中根序列。结点的值均为A-Z的大写字母,故二叉树结点个数不超过26,且保证输入的两个序列都是结点的全排列,但不一定是合法的中根和后根序列。
输出格式:
如果输入的序列不合法(不是同一棵树的中根序列和后根序列),则输出INVALID。若输入序列合法,输出为两行,第一行为一个整数,表示该二叉树的高度,第二行为一个字符串,表示该二叉树的先根序列。
输入样例1:
CEFDBHGA
CBEDFAGH
输出样例1:
3
ABCDEFGH
输入样例2:
CBEDFAGH
CEFDBHGA
输出样例2:
INVALID
输入样例3:
BCA
CAB
输出样例3:
INVALID
纯粹凑分数得写法,还有许多问题
为什么还要删除树?
为什么求高度需要 -1,
如果不构造树能求树得高度吗 等待大佬得代码。。。
#include <iostream>
#include <vector>
using namespace std;
vector<char> fir;
int flag = 1;
typedef struct Node {
char data;
struct Node* lchild;
struct Node* rchild;
} * Tree;
//后中得到二叉树
Tree postOrder(char post[], char mid[], int len) {
if (len == 0) return NULL;
Tree bt = (Tree)malloc(sizeof(struct Node));
bt->data = post[len - 1];
int i = 0;
for (i = 0; i < len; i++) {
if (post[len - 1] == mid[i]) //根据中序确定左右子树
break;
}
if (i == len) {//说明无法在中序遍历找到根 即为不合法
flag = 0;
return NULL;
} else {
//实现前序遍历 根左右
fir.push_back(bt->data);
//后序中序都是左开始,所以不需要改变,改变len即可
bt->lchild = postOrder(post, mid, i);
//后中最后才是右,需要更新函数参数post,mid,均改为右子树的部分,更新右子树的长度
bt->rchild = postOrder(post + i, mid + i + 1, len - i - 1);
}
return bt;
}
int getHeight(Tree bt) {
if (bt == NULL) return 0;
int left = getHeight(bt->lchild);
int right = getHeight(bt->rchild);
return max(left, right) + 1; //求高度每次左右子树得最大值+1
}
int main() {
string s;
getline(cin, s);
int n = s.size();
char post[n], mid[n];
for (int i = 0; i < n; i++) {
post[i] = s[i];
}
getline(cin, s);
for (int i = 0; i < n; i++) {
mid[i] = s[i];
}
Tree bt = postOrder(post, mid, n);
if (flag) {
cout << getHeight(bt) << endl;
for (int i = 0; i < fir.size(); i++) cout << fir[i];
} else
cout << "INVALID" << endl;
}