剑指offer--4.重建二叉树
来源:互联网 发布:淘宝贷款上征信吗 编辑:程序博客网 时间:2024/05/21 10:18
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
实现思想:递归方式。左右子树递归处理
/*struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} };*/class Solution {public: struct TreeNode* reConstructBinaryTree(vector<int> pre, vector<int> in) { int length = pre.size(); if (pre.empty() || in.empty() || length <= 0) return NULL; //构建根节点 TreeNode* root = new TreeNode(pre[0]); //递归的终点,到叶子节点,退出递归,打印root if (pre.size() == 1 && in.size() == 1 && pre[0]==in[0]) //叶子节点 return root; //中序遍历求根位置 //rootIn=中序遍历中root节点的位置 auto rootIn = find(in.begin(), in.end(), root->val); int leftLen = rootIn-in.begin(); if (leftLen>0) { //左子树leftLen //vector在初始化时,迭代器的最后一个参数为尾后指针。 vector<int> inLeft(in.begin(), rootIn); vector<int> preLeft(pre.begin() + 1, pre.begin() + leftLen + 1); root->left=reConstructBinaryTree(preLeft, inLeft); } if (leftLen<pre.size()) { //右子树rightLen vector<int> inRight(rootIn + 1, in.end()); vector<int> preRight(pre.begin() + leftLen + 1, pre.end()); root->right=reConstructBinaryTree(preRight, inRight); } //分支节点&根节点 return root; }};
0 0
- 剑指offer--4.重建二叉树
- 剑指offer-4.重建二叉树
- 剑指Offer--4.重建二叉树
- [剑指Offer] 4.重建二叉树
- [剑指offer]重建二叉树
- 【剑指offer】重建二叉树
- 剑指offer--重建二叉树
- 剑指offer---重建二叉树
- 剑指Offer-重建二叉树
- 剑指offer:重建二叉树
- 剑指offer-重建二叉树
- 《剑指offer》重建二叉树
- 【剑指Offer】重建二叉树
- 剑指offer-重建二叉树
- 《剑指offer》-重建二叉树
- 剑指offer 重建二叉树
- 剑指offer:重建二叉树
- 【剑指offer】重建二叉树
- linux安装IDEA
- poj 1681 Painter's Problem 高斯消元 枚举自由变元
- linux课堂笔记3
- RecyclerView解析
- java基础学习总结——Object类
- 剑指offer--4.重建二叉树
- 编译caffe遇到的问题汇总
- 【排序算法】-堆排序
- java基础学习总结——equals方法
- CSS3判断手机横屏竖屏
- 随机梯度下降求解非平滑优化:收敛结果和最优平均策略。
- STL的多线程安全问题
- 关于友盟SDK和支付宝SDK类重复的问题解决--ava.util.zip.ZipException: duplicate entry: com/ut/device/AidCallback.class
- Java ServerSocket 手动关闭监听