剑指offer题解C++【4】重建二叉树
来源:互联网 发布:csol大刀优化参数 编辑:程序博客网 时间:2024/06/03 21:36
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
解题思路
- 前序遍历:中-左-右
- 中序遍历:左-中-右
后序遍历:左-右-中
- 前序遍历序列的第一个值就是root;
- 在中序遍历序列中找到root,root左侧为左子树中序,右侧为右子树中序;
- 在前序遍历序列中找到对应的左子树前序遍历和右子树前序遍历;
- 不断递归,即可重建二叉树。
代码
/** * 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) { bool valid = true; auto res = reConstructBinaryTree(pre,vin,valid); if (!valid) return nullptr; return res; } TreeNode* reConstructBinaryTree(vector<int> & pre,vector<int> & vin, bool & valid) { TreeNode * res = nullptr; if (!valid || pre.size()!= vin.size() || pre.size() == 0) return res; int split = pre[0]; int split_vin =0; bool flag =false; for (int i=0; i!= vin.size();i++) { if (split == vin[i]) { split_vin = i; flag = true; break; } } if (!flag) { valid = false; return res; } vector<int> pre_prefix(pre.begin() + 1, pre.begin() + split_vin +1); vector<int> pre_suffix(pre.begin()+split_vin+1, pre.end()); vector<int> vin_prefix(vin.begin(), vin.begin()+split_vin); vector<int> vin_suffix(vin.begin() + split_vin + 1, vin.end()); TreeNode* left = reConstructBinaryTree(pre_prefix, vin_prefix, valid); TreeNode* right = reConstructBinaryTree(pre_suffix, vin_suffix, valid); res = new TreeNode(split); res->left = left; res->right = right; return res; }};
阅读全文
0 0
- 剑指offer题解C++【4】重建二叉树
- 《剑指offer》牛客网java题解-重建二叉树
- 剑指offer:(4)树:重建二叉树
- 剑指offer 4 重建二叉树
- 《剑指offer》—4、重建二叉树
- 剑指Offer(4)______重建二叉树
- 剑指offer(4)—重建二叉树
- 剑指offer--(4) 重建二叉树
- [剑指offer]算法4 重建二叉树
- [剑指offer]重建二叉树
- 【剑指offer】重建二叉树
- 剑指offer--重建二叉树
- 剑指offer---重建二叉树
- 剑指Offer-重建二叉树
- 剑指offer:重建二叉树
- 剑指offer-重建二叉树
- 《剑指offer》重建二叉树
- 【剑指Offer】重建二叉树
- Python3 类 私有性 公有性
- ListView高效率刷新
- 红黑树
- 安全态势,交互发现 —— 基于阿里云轻松搭建安全大屏
- poj Sunscreen
- 剑指offer题解C++【4】重建二叉树
- 对于Android中接口回调机制的理解
- liferay-ui:tabs
- HDU6044 Limited Permutation (递归,预处理阶乘逆元)
- 手机网页图片自适应大小 background-size css 图片全屏 背景尺寸设置
- vue.js框架入门学习I
- _tmain和main的区别
- ora-14551 cannot perform a DML operation inside a query
- android TextView加边框&drawable开发