[LeetCode系列] 从中序遍历和后序遍历序列构造二叉树(迭代解法)
给定中序遍历inorder和后序遍历postorder, 请构造出二叉树.
算法思路: 设后序遍历为po, 中序遍历为io.
- 首先取出po的最后一个节点作为根节点, 同时将这个节点入stn栈;
- 随后比较io的最后一个节点和stn栈顶节点:
- 如果不同则将此节点添加到栈顶节点的右侧并入stn栈, 同时从po中删除这个节点;
- 此时的栈中保存了所有还未处理左子树的右侧根节点
- 出现一次不同, 右侧子树的深度就增加1, 栈的深度就代表了当前右侧子树的深度
- 如果相同, 先缓存栈顶节点, 分别删除io和栈顶元素:
- 如果依旧相同(说明本层没有左子树), 则返回第2步;
- 如果不同(说明有左子树), 则将po的最后一个节点添加到缓存节点p的左侧, 同时将左子树入栈并从po中删除此节点, 返回第2步;
- 如果不同则将此节点添加到栈顶节点的右侧并入stn栈, 同时从po中删除这个节点;
代码:
/**
* 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 *buildTree(vector<int> &inorder, vector<int> &postorder) {
if(inorder.size() == )return NULL;
TreeNode *p;
TreeNode *root;
stack<TreeNode *> stn; root = new TreeNode(postorder.back());
stn.push(root);
postorder.pop_back(); while(true)
{
if(inorder.back() == stn.top()->val)
{
p = stn.top();
stn.pop();
inorder.pop_back();
if(inorder.size() == ) break;
if(stn.size() && inorder.back() == stn.top()->val)
continue;
p->left = new TreeNode(postorder.back());
postorder.pop_back();
stn.push(p->left);
}
else
{
p = new TreeNode(postorder.back());
postorder.pop_back();
stn.top()->right = p;
stn.push(p);
}
}
return root;
}
};
中序遍历的结果其实就是二叉树在垂直方向的投影.
注意到中序遍历的最后一个元素正好是二叉树的最右端的叶子, 而后序遍历最后才访问根节点, 也即右侧根节点都按由远到近的顺序排在最后, 所以程序第一次进入if的分支时, 树的右侧所有根节点已经构造完毕并入栈, 栈顶是最右侧的根节点.
并且此时中序遍历的结果并未删改, 我们从下到上进行左子叶的添加:
- 如果中序遍历最后一个节点和栈上节点相同, 说明中序遍历的这个节点是根节点/右侧节点, 我们跳过它并从中序遍历和栈中删除它;
- 但如果中序遍历的最后一个节点不是栈上节点, 这就说明此节点是当前父节点的左子叶, 我们添加它并删除它.
[LeetCode系列] 从中序遍历和后序遍历序列构造二叉树(迭代解法)的更多相关文章
- Leetcode:105. 从前序与中序遍历序列构造二叉树&106. 从中序与后序遍历序列构造二叉树
Leetcode:105. 从前序与中序遍历序列构造二叉树&106. 从中序与后序遍历序列构造二叉树 Leetcode:105. 从前序与中序遍历序列构造二叉树&106. 从中序与后序 ...
- LeetCode(106):从中序与后序遍历序列构造二叉树
Medium! 题目描述: 根据一棵树的中序遍历与后序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 posto ...
- [leetcode]从中序与后序/前序遍历序列构造二叉树
从中序与后序遍历序列构造二叉树 根据一棵树的中序遍历与后序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 po ...
- Leetcode 106. 从中序与后序遍历序列构造二叉树
题目链接 https://leetcode.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/descri ...
- Java实现 LeetCode 106 从中序与后序遍历序列构造二叉树
106. 从中序与后序遍历序列构造二叉树 根据一棵树的中序遍历与后序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序 ...
- leetcode 105 106 从前序与中序遍历序列构造二叉树 从中序与后序遍历序列构造二叉树
题目: 105 根据一棵树的前序遍历与中序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = ...
- leetcode 106. 从中序与后序遍历序列构造二叉树(Construct Binary Tree from Inorder and Postorder Traversal)
目录 题目描述: 示例: 解法: 题目描述: 根据一棵树的中序遍历与后序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 示例: 给出 中序遍历 inorder = [9,3,15,20,7] ...
- LeetCode 106. 从中序与后序遍历序列构造二叉树(Construct Binary Tree from Inorder and Postorder Traversal)
题目描述 根据一棵树的中序遍历与后序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [9 ...
- Leetcode(106)-从中序与后序遍历序列构造二叉树
根据一棵树的中序遍历与后序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [9,15,7 ...
随机推荐
- store procedure
store procedure: _________________________________________________ set ANSI_NULLS ON set QUOTED_IDEN ...
- 使用API失效供应商地址Demo(转)
原文地址 使用API失效供应商地址Demo DECLARE lv_return_status ) := NULL; ln_msg_count NUMBER; lv_errmsg ); lt_vend ...
- Intel DAAL AI加速——支持从数据预处理到模型预测,数据源必须使用DAAL的底层封装库
数据源加速见官方文档(必须使用DAAL自己的库): Data Management Numeric Tables Tensors Data Sources Data Dictionaries Data ...
- js 实现智能输入数字
<!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...
- 太过亲密往往不好——用non-member,non-friend替换member函数
在前一篇文章,我们提到,使用private来代替public以提高class的封装性.这一篇文章,我们将对接口发起攻势.首先来个简单的例子. class WebBrowser { public: vo ...
- 快速切题 sgu103. Traffic Lights 最短路 难度:1
103. Traffic Lights Time limit per test: 0.25 second(s)Memory limit: 4096 kilobytes input: standardo ...
- sring 监听器
参考链接:http://blog.csdn.net/ysughw/article/details/8992322 sring容器在web程序中获取的方式:http://blog.csdn.net/aq ...
- 官网下载的spring-framework的一些描述
刚下载下来是这个文件夹:
- Bugzilla使用规范
登陆Bugzilla Bugzilla登陆地址: http://172.21.8.39:21500/manual/ 账号:XXX@sim.com 密码:123456 Bugzilla简介 Bugzil ...
- MyEclipse10下创建web项目并发布到Tomcat
MyEclipse10下创建web项目并发布到Tomcat 1.软件安装(不作详细描述) 2.启动MyEclipse10 3.File-New-Project,选中Web Project,点击Next ...