[leetcode] 106. Construct Binary Tree from Inorder and Postorder Traversal(medium)
原题地址
思路:
和leetcode105题差不多,这道题是给中序和后序,求出二叉树。
解法一:
思路和105题差不多,只是pos是从后往前遍历,生成树顺序也是先右后左。
class Solution {
public:
TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {
int pos = postorder.size() - 1;
return dfs(inorder, postorder, 0, inorder.size(), pos);
}
private:
TreeNode *dfs(vector<int> &inorder, vector<int> &postorder, int beg, int end,
int &pos) {
TreeNode *node = NULL;
if (beg < end) {
int i = 0;
for (i = beg; i < end; ++i)
if (postorder[pos] == inorder[i]) break;
pos--;
node = new TreeNode(inorder[i]);
node->right = dfs(inorder, postorder, i + 1, end, pos);
node->left = dfs(inorder, postorder, beg, i, pos);
}
return node;
}
};
解法二:
解法二是看了别人的题解入手的,和解法一不同思路的是对两个序都用一组beg和end来划分区间。
中序(beg,end)很好划分,假设mid指向当前节点的root值,则分为mid前一半和mid后一半。
后序(pbeg,pend)的划分,是mid - beg的这一段距离。
class Solution
{
public:
TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder)
{
return dfs(inorder, postorder, 0, inorder.size(), 0, postorder.size());
}
private:
TreeNode *dfs(vector<int> &inorder, vector<int> &postorder, int beg, int end,
int pbeg, int pend)
{
TreeNode *node = NULL;
if (beg < end)
{
int i = 0;
for (i = beg; i < end; ++i)
if (postorder[pend - 1] == inorder[i])
break;
node = new TreeNode(inorder[i]);
node->left = dfs(inorder, postorder, beg, i, pbeg, pbeg + i - beg);
node->right =
dfs(inorder, postorder, i + 1, end, pbeg + i - beg, pend - 1);
}
return node;
}
};
解法一好理解,但是速度慢,用了16ms,击败46%
解法二难点在于理解后序区间划分的依据,用了12ms,击败78%
虽然做了105题,但是做这题还是花了一个半小时。
还是因为不够深入的理解原理,不能总是光看题解就过了。
[leetcode] 106. Construct Binary Tree from Inorder and Postorder Traversal(medium)的更多相关文章
- LeetCode 106. Construct Binary Tree from Inorder and Postorder Traversal (用中序和后序树遍历来建立二叉树)
Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume that ...
- Java for LeetCode 106 Construct Binary Tree from Inorder and Postorder Traversal
Construct Binary Tree from Inorder and Postorder Traversal Total Accepted: 31041 Total Submissions: ...
- (二叉树 递归) leetcode 106. Construct Binary Tree from Inorder and Postorder Traversal
Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume that ...
- [LeetCode] 106. Construct Binary Tree from Inorder and Postorder Traversal 由中序和后序遍历建立二叉树
Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume that ...
- C#解leetcode 106. Construct Binary Tree from Inorder and Postorder Traversal
Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume that ...
- LeetCode 106. Construct Binary Tree from Inorder and Postorder Traversal 由中序和后序遍历建立二叉树 C++
Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume that ...
- Leetcode#106 Construct Binary Tree from Inorder and Postorder Traversal
原题地址 二叉树基本操作 [ ]O[ ] [ ][ ]O 代码: TreeNode *restore(vector<i ...
- 【LeetCode】106. Construct Binary Tree from Inorder and Postorder Traversal 解题报告
[LeetCode]106. Construct Binary Tree from Inorder and Postorder Traversal 解题报告(Python) 标签: LeetCode ...
- 【LeetCode】106. Construct Binary Tree from Inorder and Postorder Traversal
Construct Binary Tree from Inorder and Postorder Traversal Given inorder and postorder traversal of ...
随机推荐
- QML学习【一】Basic Types
QML入门教程(1) QML是什么? QML是一种描述性的脚本语言,文件格式以.qml结尾.语法格式非常像CSS(参考后文具体例子),但又支持javacript形式的编程控制.它结合了QtDesi ...
- Qt通过HTTP POST上传文件(python做服务端,附下载)
本文使用Qt Creator用HTTP POST的方法上传文件,并给出一个上传文件的例程. 本文主要客户端,所以对于服务器端程序编写的描述会比较简略 服务器使用Django编写,django服务器接收 ...
- MongoDB自学日记3——架构及HA
在对mongoDB的操作有了一定基础后,终于可以扯扯HA和架构这两个高大上的概念了.在这之前当然还得弄清楚mongoDB的Key feature:Sharding. 1. Sharding Shard ...
- 二、OpenSceneGraph3.4第一个示例
1.在VS2015中创建一个OSG的空解决方案,并新建一个控制台工程,取名为Example 工程结构如下图所示: 2.工程设置 "Example"->属性,打开属性选项卡,需 ...
- 深度强化学习day01初探强化学习
深度强化学习 基本概念 强化学习 强化学习(Reinforcement Learning)是机器学习的一个重要的分支,主要用来解决连续决策的问题.强化学习可以在复杂的.不确定的环境中学习如何实现我们设 ...
- vue.js执行mounted的实例
代码如下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" c ...
- 【STL】集合运算
STL中有可以实现交集.并集.差集.对称差集的算法. 使用前需要包含头文件: #include <algorithm> 注:使用计算交集和并集的算法必须保证参与运算的两个集合有序!!! 交 ...
- 微信小程序ES6方法Promise封装接口
为何要封装接口? 有小程序开发的经验者,相信对微信API Request很熟悉了.对接接口时,有大部分的开发者都是直接调用request方法,去请求后台接口并渲染数据.诚然,直接使用api发起请求对接 ...
- 新补充 JSSSS
条件语句 补充: var a=“hello world” a这个变量是字符串了 对于里面每一个字母来说 他是字节 里面有11个字节 字节总数用length表示 如下: 根据上面的内容咱们又发现了一个运 ...
- Jenkins Email Extension插件模板
Jenkins Email Extension插件模板 <!DOCTYPE html> <html> <head> <meta charset="U ...