剑指offer JZ-4
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
示例1
返回值
复制{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; } };