PTA 7-23 還原二叉樹

知識點:

  • 根據前序遍歷和中序遍歷還原二叉樹

給定一棵二叉樹的先序遍歷序列和中序遍歷序列,要求計算該二叉樹的高度。

根據二叉樹的性質,如果我們只給出二叉樹的一種遍歷方式的結果,不能完全確定一顆二叉樹,這時的二叉樹可能具有多種形態。但是當我們給出一顆二叉樹的兩種不同遍歷方式的時候,就可以完全確定一顆二叉樹。

這裏以前序遍歷和中序遍歷爲例。
假如我們給出兩棵二叉樹的前中序遍歷分別爲

前序遍歷:ABDFGHIEC
中序遍歷:FDHGIBEAC

  • 由前序遍歷的性質,我們可以知道 A 一定是這棵樹的根結點
  • 根據中序遍歷可知, A 左邊的一定是 A 的左子樹,A 右邊的一定是 A 的右子樹
  • 同理,B 爲 A 的左子樹的根結點……
  • 如此遞歸下去就可以生成一顆確定的二叉樹

由此,我們就可以寫出遞歸的還原二叉樹的代碼:

#include <iostream>
#include <string>
using namespace std;

struct node {
    char data;
    node *left, *right;
    node(char _data): data(_data), left(NULL), right(NULL) {}
};

int n;  // 總結點數目
string preOrder, inOrder;

node *createTree(int preL, int preR, int inL, int inR) {
    if(preL > preR)
        return NULL;
    char nowChar = preOrder[preL];
    node *root = new node(nowChar);
    int pos = inOrder.find(nowChar);
    int len = pos - inL;    // 左子樹的長度
    root->left = createTree(preL + 1, preL + len, inL, pos - 1);
    root->right = createTree(preL + len + 1, preR, pos + 1, inR);
    return root;
}

int getHeight(node *root) {
    if(root == NULL)
        return 0;
    else
        return max(getHeight(root->left), getHeight(root->right)) + 1;
}

int main()
{
    cin >> n >> preOrder >> inOrder;
    node *root = createTree(0, preOrder.size()-1, 0, inOrder.size() - 1);
    printf("%d", getHeight(root));
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章