【剑指Offer】重建二叉树
2015-09-16 14:01
274 查看
题目描述
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。解题思路
输入的是前序遍历及中序遍历的结果,如示例:前序 : 1 2 4 7 3 5 6 8
中序 : 4 7 2 1 5 3 8 6
前序遍历的第一个数肯定为root,然后分别构建它的左右子树
在中序遍历里找到它的前一个数,若无,则左子树为NULL;
若有,则构建左子树;再找到它的后一个数,
若无,则右子树为NULL;若有,则构建右子树;
然后以root所在中序遍历数组位置分割成两半,记录前一半,
即左子树的大小,然后在前序遍历中也把左子树和右子树的子串
提出来,分别作为两棵树,重建,直到提出来的子串长度为0.
1
2 3
4 5 6
7 8
代码实现
class Solution7 { public: struct TreeNode* reConstructBinaryTree(vector<int> pre, vector<int> in) { return rebulidBinaryTree(pre, in); } static TreeNode* rebulidBinaryTree(vector<int>pre, vector<int>in){ if (pre.size() == 0 || in.size() == 0){ return NULL; } //获取根节点 TreeNode* root = new TreeNode(pre[0]); //查找根节点在中序遍历中的位置 int cur = -1; for (int i = 0; i < in.size(); i++){ if (pre[0] == in[i]){ cur = i; break; } } if (cur == -1){ return NULL; } //构建左子树 vector<int> lin; for (int i = 0; i < cur; i++){ lin.push_back(in[i]); } vector<int> lpre; for (int i = 1; i < lin.size() + 1; i++){ lpre.push_back(pre[i]); } root->left = rebulidBinaryTree(lpre, lin); //构建右子树 vector<int> rin; for (int i = cur+1; i < in.size(); i++){ rin.push_back(in[i]); } vector<int> rpre; for (int i = 1+lin.size(); i < pre.size() ; i++){ rpre.push_back(pre[i]); } root->right = rebulidBinaryTree(rpre, rin); return root; } };
相关文章推荐
- adobe 蛋疼的套装, 想安装一个Flash Professional CS6,标准版还没有...
- 浅谈Feature Scaling--基础知识
- JSP 九大内置对象和四大作用域简介
- javascript 交互取值
- js前端页面常用字段验证(持续更新)
- AngularJS使用 ng-options 实现传值给后台controller
- 禁用Enter键表单自动提交
- CSS中!improtant的使用
- JS获取url参数的方法
- HelloJSP!——pageContext对象
- 剑指 offer:调整数组顺序使奇数位于偶数前面
- JS对象类型
- css选择符有哪些?哪些属性可以继承?优先级算法如何计算?内联和important哪个优先
- jsp中的九大内置对象和四大作用域
- jquery获得option的值和对option进行操作
- pdf格式转换成html的方法介绍
- JSP九大内置对象
- AngularJS使用 ng-repeat 中的 $index与替代方法
- input 文本框控制文本输入长度
- 【js】JavaScript中同名标识符优先级