1. 程式人生 > 實用技巧 >劍指office--------重建二叉樹

劍指office--------重建二叉樹

題目描述

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。
 1 /**
 2  * Definition for binary tree
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
8 * }; 9 */ 10 class Solution { 11 public: 12 TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) { 13 if (pre.size()==0||vin.size()==0) return nullptr; 14 TreeNode *Head=new TreeNode(pre[0]); 15 int len=pre.size(),rt; 16 vector<int>pre1,vin1,pre2,vin2;
17 for (int i=0;i<len;i++){ 18 if (vin[i]==pre[0]){ 19 rt=i; 20 break; 21 } 22 } 23 for (int i=0;i<rt;i++){ 24 pre1.push_back(pre[i+1]); 25 vin1.push_back(vin[i]); 26 } 27 for (int
i=rt+1;i<len;i++){ 28 pre2.push_back(pre[i]); 29 vin2.push_back(vin[i]); 30 } 31 Head->left=reConstructBinaryTree(pre1,vin1); 32 Head->right=reConstructBinaryTree(pre2, vin2); 33 return Head; 34 } 35 };

特點:

前序遍歷中,第一個數便是根結點,

中序遍歷中,結點的右邊是其的右子樹,左邊則是左子樹。

兩者相連,例:

前序遍歷序列{1,2,4,7,3,5,6,8} pre

中序遍歷序列{4,7,2,1,5,3,8,6} vin 

4 7 2是1的右子樹,在先序遍歷中,對應的是2,4,7,

邊界:vin【0】與vin【2】  對應區間{4,7,2}

邊界:pre【1】與pre【3】 對應區間{2,4,7}

對應關係就是左子樹的前序遍歷比中序遍歷快一單位。

右子樹邊界則相同, vin【4】與vin【7】 對應區間{5,3,8,6}

          pre【4】與pre【7】對應區間{3,5,6,8}