劍指offer JZ-4
阿新 • • 發佈:2021-01-03
題目描述
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。 示例1輸入
複製[1,2,3,4,5,6,7],[3,2,4,1,6,5,7]
返回值
複製{1,2,5,3,4,6,7}
思路:
給出二叉樹的前序遍歷和中序遍歷,而後按層輸出該二叉樹。
類似這種問題,解法都差不多。
根據前序遍歷 【1,2,3,4,5,6,7】,我們可知這棵二叉樹的根節點是1
根據中序遍歷【3,2,4,1,6,5,7】,我們可知1的左側節點包括【3,2,4】,右側節點包括【6,5,7】
同樣的根據前序遍歷的結果,我們知道在【3,2,4】中【3】和【4】分別為2的左節點和有節點
.......
遞迴執行上述操作即可
/** * 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<intView Code> pre,vector<int> vin) { int pre_len = pre.size()-1; int vin_len = vin.size()-1; TreeNode *Tree = Solve(pre,0,pre_len,vin,0,vin_len); return Tree; } TreeNode* Solve(vector<int>pre,int ps,int pe,vector<int>vin, int vs,int ve){ if(ps > pe || vs > ve) return NULL; int val = pre[ps]; TreeNode *root = new TreeNode(val); for(int i=vs;i<=ve;i++) { if(vin[i] == val) { root->left = Solve(pre,ps+1,pe-ve+i,vin,vs,i-1); root->right = Solve(pre,pe-ve+i+1,pe,vin,i+1,ve); break; } } return root; } };