1. 程式人生 > 實用技巧 >劍指offer JZ-4

劍指offer JZ-4

題目描述

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{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<int
> 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; } };
View Code