重建二叉樹——面試題6《劍指offer》
阿新 • • 發佈:2018-12-13
題目描述:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。
/** * Definition for binary tree * 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) { /* * 1.從最後結果開始 1:為空(遍歷完)返回空,否則設定根節點 * 2.找出根節點位置,分成兩個子序列 * 3.遞迴 */ if(pre.size()==0) return NULL; TreeNode* root = new TreeNode(pre[0]); //分而治之:劃分更小的序列 vector<int> pre_left, pre_right; //先序的左右子樹 vector<int> vin_left, vin_right; //中序的左右子樹 //查詢根節點的分界處 int root_index;//根節點位置 for(root_index = 0; root_index < vin.size() && vin[root_index] != pre[0];root_index++); //構建兩個更小的子序列 for(int j = 0; j<vin.size();j++) //根據中序序列判斷左右序列 { if(j < root_index) //左子樹的兩個序列 { pre_left.push_back(pre[j+1]); //左邊新的中序 vin_left.push_back(vin[j]); //左邊新的先序 } if(j > root_index) //右子樹的兩個序列 { vin_right.push_back(vin[j]); //右邊新的中序 pre_right.push_back(pre[j]); //右邊新的先序 } } //遞迴解決更小子序列 root->left = reConstructBinaryTree(pre_left, vin_left); root->right = reConstructBinaryTree(pre_right, vin_right); return root; } };