牛客《剑指Offer》 重建二叉树
2017-07-02 16:26
253 查看
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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) { TreeNode *root = buildTree(pre,0,pre.size()-1,vin,0,vin.size()-1); return root; } private: TreeNode* buildTree(vector<int> pre,int startpre,int endpre,vector<int> vin,int startvin,int endvin){ if(startpre>endpre || startvin>endvin){ return NULL; } TreeNode *root = new TreeNode(pre[startpre]); for(int i = startvin;i<=endvin;i++){ if(vin[i]==pre[startpre]){ root->left = buildTree(pre,startpre+1,startpre+i-startvin,vin,startvin,i-1); root->right = buildTree(pre,i-startvin+startpre+1,endpre,vin,i+1,endvin); break; 4000 } } return root; } };
相关文章推荐
- 重建二叉树-牛客网-剑指offer
- 《剑指Offer》学习笔记--面试题6:重建二叉树
- 剑指offer题解C++【4】重建二叉树
- 重建二叉树——剑指offer
- 剑指offer《面试题6:重建二叉树》
- 剑指offer面试题06 重建二叉树
- 《剑指offer》面试题6 重建二叉树
- 剑指Offer学习之面试题6 :重建二叉树
- 剑指offer-重建二叉树
- [牛客网,剑指offer,python] 重建二叉树
- [牛客网,剑指offer,python] 重建二叉树
- 剑指Offer——重建二叉树(C++实现)
- 剑指offer(C++)——重建二叉树
- 《剑指offer》-重建二叉树
- 牛客《剑指Offer》从上往下打印二叉树
- 【剑指offer系列】 重建二叉树___6
- 剑指offer——重建二叉树___
- 《剑指offer》刷题笔记(树):重建二叉树
- 《剑指Offer》读书笔记04:重建二叉树
- (剑指Offer)面试题6:重建二叉树