1. 程式人生 > 其它 >7-10 重建二叉樹 (10 分)

7-10 重建二叉樹 (10 分)

技術標籤:HBU訓練營資料結構練習GPLT

給定二叉樹的中根序列和後根序列,請編寫程式建立該二叉樹,計算其高度和先根序列,最後刪除該二叉樹;如給定的中根和後根序列不合法,則亦能識別。

輸入格式:
輸入為兩行字串,第一行表示某二叉樹的後根序列,第二行表示其中根序列。結點的值均為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; }