1. 程式人生 > >day16劍指offer---重建二叉樹

day16劍指offer---重建二叉樹

題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸出的前序遍歷和中序遍歷的結果都不含有重複的數字。前序序列:1 2 3 4 5 6 - 中序序列:3 2 4 1 6 5

二叉樹節點的定義如下:

struct TreeNode {
        int val;
        TreeNode *left;
        TreeNode *right;
        TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

分析
前序: a b d c e f
中序: d b a e c f

前序遍歷的每一個節點,都是當前子樹的根節點,同時,以對應的節點
為邊界,就會把前序遍歷的結果分為左子樹和右子樹。

a是前序中第一個節點,以a為中界,把中序的結果分成:
左:db
右:ecf

對於db,由於在前序中b在d前面,所以,b是d的父親。

對於ecf,前序中c在前面,c為父親,c把e和f分開。
這裡寫圖片描述

程式碼如下:

TreeNode* reConstructBinaryTree(vector<int> pre, vector<int> vin, int &size,int left, int right) //size標誌著已經訪問前序的第幾個元素了。left和right標誌著左閉右開。
{


    int i = left;
    for ( ; i < right; ++i)
    {
        if
(pre[size] == vin[i]) break; } if(i == right) { return NULL; } TreeNode *root = NULL; root = new TreeNode(pre[size]); //建立根節點 if(left < i) //有區間的都應該檢查區間範圍。防止越界。 { root->left= reConstructBinaryTree(pre, vin,++size,left, i); } if(i+1
< right) { root->right= reConstructBinaryTree(pre, vin,++size,i+1,right); } return root; } TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) { if(pre.empty() || vin.empty() || pre.size() != vin.size()) return NULL; int size =0; return reConstructBinaryTree(pre, vin, size,0,pre.size()); }