根據二叉樹序列重建二叉樹

  二叉樹有前序、中序、後序、層次四種遍歷方式。
  層次遍歷我們就不考慮,因爲比較簡單。
  我們一般是根據前序和中序、中序和後序這兩種方式來重建二叉樹,注意必須要有中序序列才能唯一確定一棵樹。無論是前序和中序、中序和後序構建思路都是一致的。
  重建的思路是採用迭代的思想:
  比如依照前序和中序
  1.我們設定一個函數,把前序和中序傳進來,通過前序找到當前的根,並返回根。
  2.在返回根之前,根據中序能知道根的左右子樹分別包含哪些數字,我們就把根左邊部分的中序和前序傳給函數並獲取返回值,將該返回值賦給當前節點的left指針;
  3.根的right指針同理,根據根右邊部分的中序和前序獲取返回值;
  4.重複上述過程,迭代結束就能獲取一棵完整的樹。
  代碼如下:

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
        if(pre.size()==0 || vin.size()==0)
            return NULL;
        int root=pre[0];
        vector<int> left_pre,left_vin,right_pre,right_vin;
        bool find_root=false;
        for(int i=0;i<vin.size();i++)
        {
            if(vin[i]==root)//找到根節點
            {
                find_root=true;
                continue;
            }
            if(find_root)
                right_vin.push_back(vin[i]);//右子樹中序
            else
                left_vin.push_back(vin[i]);//左子樹中序
        }
        for(int i=1;i<pre.size();i++)
        {
            if(left_pre.size()!=left_vin.size())
                left_pre.push_back(pre[i]);//左子樹前序
            else
                right_pre.push_back(pre[i]);//右子樹前序
        }
        TreeNode *head=new TreeNode(root);
        head->left=reConstructBinaryTree(left_pre,left_vin);
        head->right=reConstructBinaryTree(right_pre,right_vin);
        return head;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章