(二叉树 递归) leetcode 889. Construct Binary Tree from Preorder and Postorder Traversal
Return any binary tree that matches the given preorder and postorder traversals.
Values in the traversals pre
and post
are distinct positive integers.
Example 1:
Input: pre = [1,2,4,5,3,6,7], post = [4,5,2,6,7,3,1]
Output: [1,2,3,4,5,6,7]
Note:
1 <= pre.length == post.length <= 30
pre[]
andpost[]
are both permutations of1, 2, ..., pre.length
.- It is guaranteed an answer exists. If there exists multiple answers, you can return any of them.
----------------------------------------------------------------------------------------------------------------------------------
这个是从先序遍历和后序遍历构建二叉树,不过却和之前的leetcode105 和 leetcode106的从中序遍历和先序遍历构建二叉树以及中序遍历和后序遍历构建二叉树不同的是,这个构建二叉树是不唯一的。另外,实现的代码和之前的两个题是也有一些不同。(注:关于这个怎么确定从先序遍历和后序遍历构建二叉树,可以看官方题解:https://leetcode.com/articles/construct-binary-tree-from-preorder-and-postorder-/ 和另一个大佬的博客https://blog.csdn.net/waple_0820/article/details/81837875)
C++代码1:
这个代码和leetcode 105 以及106的的用时20多ms的代码相比,添加了其中一个数组的长度(pre.size()),这样的会方便确定递归遍历时的终止点。不过有些代码是多余的。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* constructFromPrePost(vector<int>& pre, vector<int>& post) {
return build(pre,,pre.size()-,post,,pre.size() - ,pre.size());
}
TreeNode* build(vector<int> &pre,int prel,int prer,vector<int> &post,int posl,int posr,int N){
if(prel > prer || posl > posr) return NULL;
if(N == )
return NULL;
TreeNode *cur = new TreeNode(pre[prel]);
if(N == )
return cur;
int i = ;
for(i = ; i < N; i++){
if(pre[prel + ] == post[posl + i - ])
break;
}
cur->left = build(pre,prel + ,prel + i,post,posl,posl + i - ,i);
cur->right = build(pre,prel + i + ,prer,post,posl + i,posr-,N--i);
return cur;
}
};
C++代码2:
去除以上的多余的代码:build()里面的参数去掉了pre和post数组的末端的数的下标,不过保留了pre和post数组的长度,这个也会确定pre的末端的数的下标。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* constructFromPrePost(vector<int>& pre, vector<int>& post) {
return build(pre,,post,,pre.size());
}
TreeNode* build(vector<int> &pre,int prel,vector<int> &post,int postl,int N){
if(N == ) return ;
TreeNode *cur = new TreeNode(pre[prel]);
if(N == ) return cur;
int i = ;
for(i = ; i < N; i++){
if(pre[prel + ] == post[postl + i - ])
break;
}
cur->left = build(pre,prel + ,post,postl,i);
cur->right = build(pre,prel + i + ,post,postl + i,N - - i);
return cur;
}
};
C++代码3:
和leetcode105和106的用时150ms以上的代码基本类似,就是 if(pre.size() == 1 || post.size() == 1) return cur;这个代码不能漏掉,这个是必须写上的递归的终止条件。还有,这个代码耗时比较少。。。。才20多ms。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* constructFromPrePost(vector<int>& pre, vector<int>& post) {
return build(pre,post);
}
TreeNode* build(vector<int> &pre,vector<int> &post){
if(pre.size() == || post.size() == ) return NULL;
int rootval = pre[];
TreeNode *cur = new TreeNode(rootval);
if(pre.size() == || post.size() == ) return cur;
int i = ;
for(i = ; i < pre.size(); i++){
if(pre[] == post[i - ])
break;
}
vector<int> prel,prer,postl,postr;
for(int k = ; k <= i; k++){
prel.push_back(pre[k]);
}
for(int k = i + ; k < pre.size(); k++){
prer.push_back(pre[k]);
}
for(int k = ; k < i; k++){
postl.push_back(post[k]);
}
for(int k = i; k < post.size() - ; k++){
postr.push_back(post[k]);
}
cur->left = build(prel,postl);
cur->right = build(prer,postr);
return cur;
}
};
(二叉树 递归) leetcode 889. Construct Binary Tree from Preorder and Postorder Traversal的更多相关文章
- (二叉树 递归) leetcode 105. Construct Binary Tree from Preorder and Inorder Traversal
Given preorder and inorder 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 ...
- [LeetCode] 889. Construct Binary Tree from Preorder and Postorder Traversal 由先序和后序遍历建立二叉树
Return any binary tree that matches the given preorder and postorder traversals. Values in the trave ...
- LeetCode 889. Construct Binary Tree from Preorder and Postorder Traversal
原题链接在这里:https://leetcode.com/problems/construct-binary-tree-from-preorder-and-postorder-traversal/ 题 ...
- LC 889. Construct Binary Tree from Preorder and Postorder Traversal
Return any binary tree that matches the given preorder and postorder traversals. Values in the trave ...
- 【LeetCode】889. Construct Binary Tree from Preorder and Postorder Traversal 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- [LeetCode] 105. Construct Binary Tree from Preorder and Inorder Traversal 由先序和中序遍历建立二叉树
Given preorder and inorder 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 ...
- [Leetcode Week14]Construct Binary Tree from Inorder and Postorder Traversal
Construct Binary Tree from Inorder and Postorder Traversal 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/pr ...
随机推荐
- html和css的使用方法以及样式
布局步骤 第一步: 清除默认样式第二步: 划分模块第三步: 设置模块的大小以及位置第四步: 划分下一级模块 html和css 引入网页头像 <link rel="shortcut ic ...
- MyBatis学习---整合SpringMVC
[目录]
- 怎樣添加設置GridView,CheckBox全選功能
GridView內CheckBox控件全選設置 不需要添加後台代碼操作,前端即可完成設置,如下: 前端代碼: 1.設置javascript. <html xmlns="http://w ...
- Linux学习历程——Centos 7 ls命令
一.命令介绍 ls命令用于显示目录中的信息. ----------------------------------------------------------------------------- ...
- k8s部署dashboard:v1.5.1
1.准备dashboard.yaml文件 apiVersion: extensions/v1beta1 kind: Deployment metadata: # Keep the name in sy ...
- Python之爬虫的理解
# -*- coding: utf-8 -*- 中文用户一定先用这行来声明编码方式 爬虫: 爬虫是自动访问互联网,并且提取数据的程序 (从网络上获取非结构化的数据,ETL将这些数据转换为结构化数 ...
- Linux Mint有进程管理器吗?答案是肯定的
Linux Mint系统内置了一个系统管理器,叫 "System Monitor",通过 Menu -->> 系统工具 可以查看 . 如下图,在管理器上右键,可以&qu ...
- .net prams关键字
先举个例子: 代码如下: class Program { static void Main(string[] args) { Console.WriteLine(Sum(1)); Console.Wr ...
- Python爬虫爬取网页图片
没想到python是如此强大,令人着迷,以前看见图片总是一张一张复制粘贴,现在好了,学会python就可以用程序将一张张图片,保存下来. 今天逛贴吧看见好多美图,可是图片有点多,不想一张一张地复制粘贴 ...
- Redis进阶之使用Lua脚本开发
1.在Redis中使用Lua 在Redis中执行Lua脚本有两种方法:eval和evalsha. (1)eval eval 脚本内容 key个数 key列表 参数列表 下面例子使用了key列表和参数列 ...