[leetcode]从中序与后序/前序遍历序列构造二叉树
从中序与后序遍历序列构造二叉树
根据一棵树的中序遍历与后序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
思路: 根据构造二叉树的流程,中序遍历的访问顺序为左-中-右;后序遍历的方位顺序为左-右-中。
- 后序最后一个节点为根节点,在中序列表中查找根节点值
- 将中序列表分割成左子树中序列表和右子树中序列表
- 因为对于同样的树中序和后序列表长度相同,所以根据左子树中序列表和右子树中序列表的长度将后序列表分割成左子树后序和右子树后序
- 对左子树根节点,右子树根节点递归调用
- 返回根节点
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder)
{
int n=inorder.size();
if(n>0)
{
TreeNode* root=new TreeNode(postorder[n-1]);
vector<int>::iterator it=find(inorder.begin(),inorder.end(),postorder[n-1]);
vector<int> il,ir,pl,pr;
il.assign(inorder.begin(),it);
ir.assign(it+1,inorder.end());
int l,r;
l=il.size();
r=ir.size();//中序后序遍历长度相等
pl.assign(postorder.begin(),postorder.begin()+l);
pr.assign(postorder.begin()+l,postorder.end());
root->left=buildTree(il,pl);
root->right=buildTree(ir,pr);
return root;
}
else return NULL;
}
从前序与中序遍历序列构造二叉树
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
思路:
和中序后序构造思路基本一致
根据构造二叉树的流程,前序遍历的访问顺序为中-左-右,中序遍历的访问顺序为左-中-右。
- 前序第一一个节点为根节点,在中序列表中查找根节点值
- 将中序列表分割成左子树中序列表和右子树中序列表
- 因为对于同样的树中序和前序列表长度相同,所以根据左子树中序列表和右子树中序列表的长度将前序列表分割成左子树前序和右子树前序
- 对左子树根节点,右子树根节点递归调用
- 返回根节点
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder)
{
int n=preorder.size();
if(n>0)
{
TreeNode* root=new TreeNode(preorder[0]);
vector<int>::iterator it=find(inorder.begin(),inorder.end(),preorder[0]);
vector<int> il,ir,pl,pr;
il.assign(inorder.begin(),it);
ir.assign(it+1,inorder.end());
int l,r;
l=il.size();
r=ir.size();//中序前序遍历长度相等
pl.assign(preorder.begin()+1,preorder.begin()+l+1);
pr.assign(preorder.begin()+l+1,preorder.end());
root->left=buildTree(pl,il);
root->right=buildTree(pr,ir);
return root;
}
else return NULL;
}
[leetcode]从中序与后序/前序遍历序列构造二叉树的更多相关文章
- Leetcode:105. 从前序与中序遍历序列构造二叉树&106. 从中序与后序遍历序列构造二叉树
Leetcode:105. 从前序与中序遍历序列构造二叉树&106. 从中序与后序遍历序列构造二叉树 Leetcode:105. 从前序与中序遍历序列构造二叉树&106. 从中序与后序 ...
- 【2】【leetcode-105,106】 从前序与中序遍历序列构造二叉树,从中序与后序遍历序列构造二叉树
105. 从前序与中序遍历序列构造二叉树 (没思路,典型记住思路好做) 根据一棵树的前序遍历与中序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [ ...
- Java实现 LeetCode 106 从中序与后序遍历序列构造二叉树
106. 从中序与后序遍历序列构造二叉树 根据一棵树的中序遍历与后序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序 ...
- LeetCode 中级 - 从前序与中序遍历序列构造二叉树(105)
一个前序遍历序列和一个中序遍历序列可以确定一颗唯一的二叉树. 根据前序遍历的特点, 知前序序列(PreSequence)的首个元素(PreSequence[0])为二叉树的根(root), 然后在中 ...
- LeetCode106. 从中序与后序遍历序列构造二叉树
106. 从中序与后序遍历序列构造二叉树 描述 根据一棵树的中序遍历与后序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 示例 例如,给出 中序遍历 inorder = [9,3,15,20 ...
- Java实现 LeetCode 105 从前序与中序遍历序列构造二叉树
105. 从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中 ...
- [LeetCode]105. 从前序与中序遍历序列构造二叉树(递归)、108. 将有序数组转换为二叉搜索树(递归、二分)
题目 05. 从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 题解 使用HashMap记录当前子树根节点在中序遍历中的位置,方便每次 ...
- LeetCode---105. 从前序与中序遍历序列构造二叉树 (Medium)
题目:105. 从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7 ...
- LeetCode(106):从中序与后序遍历序列构造二叉树
Medium! 题目描述: 根据一棵树的中序遍历与后序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 posto ...
随机推荐
- window7远程桌面到server不能复制粘贴解决的方法
用远程桌面登陆server不能在本机和远程server之间粘贴文本了,即不能从本机复制文本粘贴到server,也不能从server复制文本粘贴到本机. 下面是解决方法之中的一个,试了几次都非常管用户: ...
- vue部署到tomcat
# vue打包到tomcat部署步骤a.进入项目目录运行npm run devb.将dist目录复制到远程服务器下的tomcat/webapps下c.重启tomcatd.浏览器中访问 http:本机i ...
- virtualbox+vagrant学习-2(command cli)-16-vagrant snapshot命令
Snapshot快照 这是用于管理客户机器快照的命令.快照记录客户计算机的时间点状态.然后可以快速恢复到此环境.这可以让你进行试验和尝试,并迅速恢复到以前的状态. 快照并不是每个provider都支持 ...
- 一维maxpooling
index存储的是下标 vector<int> maxpooling(vector<int> num,int size){ vector<int> result; ...
- [转]SVN服务器搭建和使用(一)
Location是指VisualSVN Server的安装目录,Repositorys是指定你的版本库目录.Server Port指定一个端口,Use secure connection勾山表示使用安 ...
- 1360: Good Serial Inc.(不知道是什么类型的题)
1360: Good Serial Inc. Submit Page Summary Time Limit: 1 Sec Memory Limit: 128 Mb Subm ...
- Nginx服务器的平滑启动、平缓停止、平滑升级
注:Nginx服务在运行时,会保持一个主进程(master process)和一个或多个工作进程(worker process). 每一个进程都会有一个PID进程号,可以通过向主进程的PID进程号发送 ...
- vue实现菜单切换
vue实现菜单切换,点击菜单导航切换不同的内容以及为当前点击的选项添加样式,或者组件. method里: css: html代码: <nav> <ul> <li> ...
- 异步fifo with 读控制
之前做LDPC编码器时,学习了一下异步FIFO的相关知识,主要参考了http://www.cnblogs.com/aslmer/p/6114216.html,并在此基础上根据项目需求,添加了一个读控制 ...
- C语言 基础练习40
一.题目 1.输入2个整数,求两数的平方和并输出. 2. 输入一个圆半径(r)当r>=0时,计算并输出圆的面积和周长,否则,输出提示信息. 3.函数y=f(x)可表示为: 4.编写一个程序,从4 ...