根据一棵树的前序遍历与中序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

例如,给出

前序遍历 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 size = preorder.size();
if(size==0 || inorder.empty())
{
return NULL;
}
int r = preorder[0];//在前序遍历中。第一个节点就是我们所求二叉树的根节点
TreeNode* root = new TreeNode(r);
int p=0;
for(;p<size;p++)
{
if(inorder[p]==r)//在中序遍历中找到根节点的位置
break;
}
vector<int> pre_left,pre_right,in_left,in_right;
for(int i=0;i<size;i++)
{
if(i<p)
{
pre_left.push_back(preorder[i+1]);//前序遍历中,从头到中序遍历的根节点的位置p,这个区间上的点是左子树的前序遍历
in_left.push_back(inorder[i]);//中序遍历中,从头到根节点的位置p,这个区间的点是左子树的中序遍历
}
else if(i>p)
{
pre_right.push_back(preorder[i]);//前序遍历中,从位置p到末尾,这个区间是右子树的前序遍历
in_right.push_back(inorder[i]);//中序遍历中,从位置p到末尾,这个区间是右子树的中序遍历
}
}
root->left = buildTree(pre_left,in_left);//递归实现左子树和右子树的重建过程
root->right = buildTree(pre_right,in_right);
return root;
}

当然还有非递归的方法,也是利用栈来完成的,但是思路不是很好理解。谨附下代码

 TreeNode* buildTree(vector<char>& preorder, vector<char>& inorder) {
if(preorder.empty()) return NULL;
TreeNode* t=new TreeNode(preorder[0]),*p=t;
stack<TreeNode*> roots;
int size=preorder.size(), i=0,j=0;
while(j<size-1)
{
// roots.push(p);
while(preorder[i++]!=inorder[j])
{
p->left=new TreeNode(preorder[i]);
roots.push(p);
p=p->left;
}
if(i==size) break;
while(++j<size&&!roots.empty()&&inorder[j]==roots.top()->val)
{ p=roots.top(); roots.pop();
}
p->right=new TreeNode(preorder[i]);
p=p->right;
}
return t;
}

Leetcode(105)-从前序与中序遍历序列构造二叉树的更多相关文章

  1. Java实现 LeetCode 105 从前序与中序遍历序列构造二叉树

    105. 从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中 ...

  2. [LeetCode]105. 从前序与中序遍历序列构造二叉树(递归)、108. 将有序数组转换为二叉搜索树(递归、二分)

    题目 05. 从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 题解 使用HashMap记录当前子树根节点在中序遍历中的位置,方便每次 ...

  3. 【leetcode 105. 从前序与中序遍历序列构造二叉树】解题报告

    前往 中序,后序遍历构造二叉树, 中序,前序遍历构造二叉树 TreeNode* build(vector<int>& preorder, int l1, int r1, vecto ...

  4. LeetCode 105. 从前序与中序遍历序列构造二叉树(Construct Binary Tree from Preorder and Inorder Traversal)

    题目描述 根据一棵树的前序遍历与中序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9, ...

  5. Leetcode 105. 从前序与中序遍历序列构造二叉树

    题目链接 题目描述 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder ...

  6. leetcode 105从前序与中序遍历序列构造二叉树

    方法一:直接使用复制的数据递归:O(n)时间,O(n)空间,不计算递归栈空间: /** * Definition for a binary tree node. * struct TreeNode { ...

  7. Leetcode:105. 从前序与中序遍历序列构造二叉树&106. 从中序与后序遍历序列构造二叉树

    Leetcode:105. 从前序与中序遍历序列构造二叉树&106. 从中序与后序遍历序列构造二叉树 Leetcode:105. 从前序与中序遍历序列构造二叉树&106. 从中序与后序 ...

  8. LeetCode 中级 - 从前序与中序遍历序列构造二叉树(105)

    一个前序遍历序列和一个中序遍历序列可以确定一颗唯一的二叉树. 根据前序遍历的特点, 知前序序列(PreSequence)的首个元素(PreSequence[0])为二叉树的根(root),  然后在中 ...

  9. 【LeetCode】105#从前序与中序遍历序列构造二叉树

    题目描述 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9 ...

  10. 【2】【leetcode-105,106】 从前序与中序遍历序列构造二叉树,从中序与后序遍历序列构造二叉树

    105. 从前序与中序遍历序列构造二叉树 (没思路,典型记住思路好做) 根据一棵树的前序遍历与中序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [ ...

随机推荐

  1. 容器编排系统K8s之包管理器helm基础使用(二)

    前文我们介绍了helm的相关术语和使用helm安装和卸载应用,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14305902.html:今天我们来介绍下自定义 ...

  2. Flask源码关于local的实现

    flask源码关于local的实现 try: # 协程 from greenlet import getcurrent as get_ident except ImportError: try: fr ...

  3. Java编程技术之浅析SPI服务发现机制

    SPI服务发现机制 SPI是Java JDK内部提供的一种服务发现机制. SPI->Service Provider Interface,服务提供接口,是Java JDK内置的一种服务发现机制 ...

  4. 【转载】Linux中找不到ifconfig命令的解决方法

    ifconfig命令出错 ifconfig命令是设置或显示网络接口的程序,可以显示出我们机器的网卡信息,可是有些时候最小化安装CentOS等Linux发行版的时候会默认不安装ifconfig等命令,这 ...

  5. By default, the connection will be closed if the proxied server does not transmit any data within 60 seconds.

    WebSocket proxying https://nginx.org/en/docs/http/websocket.html By default, the connection will be ...

  6. 数据备份与恢复 半持久化 全持久化 fork aof rdb Backing up Disaster recovery 备份 容灾

    Redis数据备份与恢复 - 流年晕开时光 - 博客园 https://www.cnblogs.com/deny/p/11531355.html Redis数据备份与恢复 Redis所有数据都是保存在 ...

  7. 【笔记】学习markdown

    经过来自学长(姐?)的 嘲讽 善意提醒后,我才知道这个博客园好像 资瓷 markdown 于是我决定要认真学习markdown(绝不是因为洛谷题解又过不去了) 正常点: 由于没人教,我上网查了一下 一 ...

  8. 九:SpringBoot-整合Mybatis框架,集成分页助手插件

    九:SpringBoot-整合Mybatis框架,集成分页助手插件 1.Mybatis框架 1.1 mybatis特点 1.2 适用场景 2.SpringBoot整合MyBatis 2.1 核心依赖 ...

  9. VMware vCenter 6.0 安装及群集配置介绍(转载)

    转载自http://blog.51cto.com/wzlinux/2094598 一.介绍 VMware vCenter Server 提供了一个可伸缩.可扩展的平台,为虚拟化管理奠定了基础.可集中管 ...

  10. c++ stl list使用总结(转)

    转自:http://blog.csdn.net/nupt123456789/article/details/8120397 #include <iostream> #include < ...