从中序与后序遍历序列构造二叉树

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

注意:

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

例如,给出

中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]

返回如下的二叉树:

    3
/ \
9 20
/ \
15 7

思路: 根据构造二叉树的流程,中序遍历的访问顺序为左-中-右;后序遍历的方位顺序为左-右-中。

  1. 后序最后一个节点为根节点,在中序列表中查找根节点值
  2. 将中序列表分割成左子树中序列表和右子树中序列表
  3. 因为对于同样的树中序和后序列表长度相同,所以根据左子树中序列表和右子树中序列表的长度将后序列表分割成左子树后序和右子树后序
  4. 对左子树根节点,右子树根节点递归调用
  5. 返回根节点
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

思路:

和中序后序构造思路基本一致

根据构造二叉树的流程,前序遍历的访问顺序为中-左-右,中序遍历的访问顺序为左-中-右。

  1. 前序第一一个节点为根节点,在中序列表中查找根节点值
  2. 将中序列表分割成左子树中序列表和右子树中序列表
  3. 因为对于同样的树中序和前序列表长度相同,所以根据左子树中序列表和右子树中序列表的长度将前序列表分割成左子树前序和右子树前序
  4. 对左子树根节点,右子树根节点递归调用
  5. 返回根节点
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]从中序与后序/前序遍历序列构造二叉树的更多相关文章

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

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

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

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

  3. Java实现 LeetCode 106 从中序与后序遍历序列构造二叉树

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

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

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

  5. LeetCode106. 从中序与后序遍历序列构造二叉树

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

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

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

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

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

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

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

  9. LeetCode(106):从中序与后序遍历序列构造二叉树

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

随机推荐

  1. HBase Master高可用(HA)

    HMaster没有单点问题,HBase中可以启动多个HMaster,通过Zookeeper的Master Election机制保证总有一个Master运行. 所以这里要配置HBase高可用的话,只需要 ...

  2. KVOController原理解析

    1.使用类似动态代理的模式和消息派发中枢模式实现整个架构: 2.使用NSMapTable和NSHashTable进行切面信息的增删查维护:主要用于去重和查看是否存在. 实现方式 消息流 KVOCont ...

  3. openstack常用的一些命令

    查看rabbitmq 队列 rabbitmqctl list_queues 复制代码 查看keystone的用户 keystone user-list 复制代码 查看keystone endpoint ...

  4. c++ 浅拷贝和深拷贝 指针和引用的区别 malloc(free)和new(delete)的区别 重载重写重定义

    4.malloc(free)和new(delete)的区别 malloc()函数: 1.1 malloc的全称是memory allocation,中文叫动态内存分配. 原型:extern void ...

  5. jQuery内容横向拖拽滚动

    如果有业务需求:使用横向滚动,而又不想用滚动条,可以使用横向拖拽滚动,主要是利用元素的scrollLeft特性: 废话不多说直接上代码: css: .box{ width:100%; height:3 ...

  6. Octave安装

    转自:https://www.cnblogs.com/freeweb/p/7124589.html Octave是一种解释类的编程语言,并且是GNU项目下的开源软件,与之相对是大家都非常熟悉的matl ...

  7. .NET平台下开源三维 GIS (地形与游戏)平台资料

    .net平台下开源(免费)三维(地形,游戏)GIS平台 open source (free) 3d (terrain,game) gis platform based on .net (C#) Axi ...

  8. Caused by: org.apache.velocity.exception.MethodInvocationException: Invocation of method 'getUser' in class org.uncommons.reportng.ReportMetadata threw exception class java.net.UnknownHostException :

    Running TestSuite [TestNG] [WARN] Ignoring duplicate listener : org.uncommons.reportng.HTMLReporter ...

  9. AWR报告中Top 10 Foreground Events存在”reliable message”等待事件的处理办法

    操作系统版本:HP-UNIX B.11.31 数据库版本:11.2.0.4 RAC (一) 问题概要 (1)在AWR报告的Top 10 Foreground Events中发现reliable mes ...

  10. ios宏定义学习

    宏简介: 宏是一种批量处理的称谓.一般说来,宏是一种规则或模式,或称语法替换 ,用于说明某一特定输入(通常是字符串)如何根据预定义的规则转换成对应的输出(通常也是字符串).这种替换在预编译时进行,称作 ...