[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 ...
随机推荐
- HTML连载10-details标签&summary标签&marquee标签
1.详情(details)与概要(summary)标签 (1)作用:我们希望用尽可能少的空间来表达更多的信息,利用summary标签来描述概要信息,用details标签来描述详情信息 (2)格式: ...
- Python连载7-time包的其他函数
接连载6 一.time包 1.函数:sleep(second) (1)含义:是程序进入休眠状态多少秒 (2)格式:time.sleep(int num) 2.函数:strftime() (1)含义:将 ...
- 使用 Python 识别并提取图像中的文字
1. 介绍 介绍使用 python 进行图像的文字识别,将图像中的文字提取出来,可以帮助我们完成很多有趣的事情. 2. 必备工具 tesseract-ocr 下载地址: https://github. ...
- Zookeeper详解-工作流和leader选举(三)
一.工作流 一旦ZooKeeper集合启动,它将等待客户端连接.客户端将连接到ZooKeeper集合中的一个节点.它可以是leader或follower节点.一旦客户端被连接,节点将向特定客户端分配会 ...
- Python自学day-11
一.RabbitMQ概述 RabbitMQ是一种消息队列,是一个公共的消息中间件,用于不同进程之间的通讯. 除了RabbitMQ以外,还有ZeroMQ.ActiveMQ等等. 前面学习了两种队列: 线 ...
- Java---使用EWS 写个ExchangeMailUtil
依赖包: commons-httpclient-3.1.jar commons-codec-1.10.jar commons-logging-1.2.jar jcifs-1.3.17.jar 代码示例 ...
- 小白也能看懂的 Laravel 核心概念讲解
自动依赖注入 什么是依赖注入,用大白话将通过类型提示的方式向函数传递参数. 实例 1 首先,定义一个类: /routes/web.php class Bar {} 假如我们在其他地方要使用到 Bar ...
- python读取excel文件中所有sheet表格
sales: store: """(1)用load_workbook函数打开excel文件,返回一个工作簿对象 (2)用工作簿对象获取所有的sheet (3)第一个for ...
- 从Spring的几个阶段理解其工作过程
Spring框架非常强大,想要彻底弄懂Spring是非常困难的. 为了便于了解Spring的工作原理,我们来研究一下,Spring是怎么加载的,Spring会经过几个阶段. 我们站在Javaweb ...
- Vue快速学习_第一节
之前写CRM都是Django前后端一起写的,在大部分项目中实际上前后端是分离的,因此我们需要学习一个前端框架来进行前端页面的编写,这里选择了Vue进行学习,好了开始学习吧. 1.ES6部分知识点学习 ...