7-10 重建二叉樹 (10 分)
阿新 • • 發佈:2021-02-04
給定二叉樹的中根序列和後根序列,請編寫程式建立該二叉樹,計算其高度和先根序列,最後刪除該二叉樹;如給定的中根和後根序列不合法,則亦能識別。
輸入格式:
輸入為兩行字串,第一行表示某二叉樹的後根序列,第二行表示其中根序列。結點的值均為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;
}