微信搜一搜bigsai
大家都在关注的刷题、学习数据结构和算法宝藏项目
关注回复进群即可加入力扣打卡群,欢迎划水。近期打卡:
LeetCode 98验证二叉搜素树(中序遍历)&99恢复二叉搜索树
LeetCode 100相同的树&101对称二叉树
LeetCode 102二叉树的层序遍历&103二叉树锯齿形遍历&104二叉树的最大深度

前言

在面试的过程中,我们经常会遇到一些数据结构相关的问题,很多经典问题百问不烂。而数据结构的问题中排序、链表、二叉树等问题又是经久不衰,这不,今天就分享一道关于经典的问题:给定两个序列如何构造一颗二叉树。

tips:遇到二叉树相关的问题,多半和递归有关系

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

根据一棵树的前序遍历与中序遍历构造二叉树。当然也是力扣105的原题。

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

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]

返回如下的二叉树:

    3/ \9  20/  \15   7

分析:
给定一个前序序列和一个中序序列,且里面没有重复的元素,如何构造一和二叉树呢?我们可以先单独观察两个序列的特征:

前序遍历:遍历规则为(根,[左侧区域],[右侧区域])。
中序遍历:遍历规则为([左侧区域],根,[右侧区域])。

其中前序遍历的左侧区域和中序遍历的左侧区域包含元素的范围相同,根也是相同的。所以可以进行这样的操作:

  1. 根据前序遍历的第一个找到根节点,可以确定根
  2. 通过中序遍历找到根节点的值,这样可以知道左侧区域和右侧区域节点个数多少。
  3. 根节点左侧区域由前中序列确定的左侧区域确定,根节点的右侧节点由前中序序列的右侧区域确定。

一些操作可以借助这张图进行理解:

具体的实现上,可以使用一个HashMap存储中序存储的序列,避免重复计算。实现的代码为:

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {public TreeNode buildTree(int[] preorder, int[] inorder) {if(preorder.length==0)return null;TreeNode root=new TreeNode(preorder[0]);Map<Integer, Integer>map=new HashMap<Integer, Integer>();for(int i=0;i<inorder.length;i++){map.put(inorder[i], i);}return buildTree(preorder,0,preorder.length-1, map,0,inorder.length-1);}private TreeNode buildTree(int[] preorder, int preStart, int preEnd, Map<Integer, Integer> map, int inStart, int inEnd) {// TODO Auto-generated method stubif(preEnd<preStart||inEnd<inStart)return null;TreeNode node=new TreeNode(preorder[preStart]);int i=map.get(preorder[preStart]);//节点的值int leftlen=i-inStart;//左面的长度node.left=buildTree(preorder, preStart+1, preStart+1+leftlen, map, inStart, i-1);node.right=buildTree(preorder, preStart+leftlen+1,preEnd, map, i+1, inEnd);return node;       }
}

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

根据一棵树的中序遍历与后序遍历构造二叉树,力扣106题

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

例如,给出

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

返回如下的二叉树:

    3/ \9  20/  \15   7

分析:
有了上面的分析,那么通过一个后序遍历和中序遍历去构造一棵二叉树,其实原理和前面的也是一样的。

后序遍历:遍历规则为([左侧区域],[右侧区域],根)。
中序遍历:遍历规则为([左侧区域],根,[右侧区域])。


具体实现的代码为:

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {public TreeNode buildTree(int[] inorder,int[] postorder) {if(postorder.length==0)return null;Map<Integer, Integer>map=new HashMap<Integer, Integer>();for(int i=0;i<inorder.length;i++){map.put(inorder[i], i);}return buildTree(postorder,0,postorder.length-1, map,0,inorder.length-1);}private TreeNode buildTree(int[] postorder, int postStart, int postEnd, Map<Integer, Integer> map, int inStart, int inEnd) {// TODO Auto-generated method stubif(postEnd<postStart||inEnd<inStart)return null;TreeNode node=new TreeNode(postorder[postEnd]);int i=map.get(postorder[postEnd]);int leftlen=i-inStart;node.left=buildTree(postorder, postStart,postStart+leftlen-1, map, inStart, i-1);node.right=buildTree(postorder, postStart+leftlen,postEnd-1, map, i+1, inEnd);           return node;      }
}

原创不易,bigsai请你帮两件事帮忙一下:

  1. star支持一下, 您的肯定是我在平台创作的源源动力。

  2. 微信搜索「bigsai」,关注我的公众号,不仅免费送你电子书,我还会第一时间在公众号分享知识技术。加我还可拉你进力扣打卡群一起打卡LeetCode。

记得关注、咱们下次再见!

经典面试题:给两个序列如何构造一棵二叉树相关推荐

  1. 试编写程序,利用前、中序序列或者后、中序序列唯一确定一棵二叉树。

    目录 1.题目 2.程序设计 3.使用说明 4.测试结果 5.源码 1.题目 [问题描述] 如果给出了遍历二叉树的前序序列和中序序列,则可以构造出唯一的一棵二叉树.试编写实现上述功能的程序. [基本要 ...

  2. 分别采用递归和非递归方式编写两个函数,求一棵二叉树中叶子节点个数

    分别采用递归和非递归方式编写两个函数,求一棵二叉树中叶子节点个数 #include #include #define MAXSIZE 50 typedef char datatype; typedef ...

  3. 为了搞明白统计套利,从两组序列之间的关系说起

    注:只是先记下来,怕忘了 i x y 1 25 110 2 27 115 3 31 155 4 33 160 5 35 180 均值(MA),不解释 方差,序列,减均值的平方(有正有负,平方更好计算) ...

  4. 李洪强iOS经典面试题153- 补充

    李洪强iOS经典面试题153- 补充   补充 有空就来解决几个问题,已经懒癌晚期没救了... UML 统一建模语言(UML,UnifiedModelingLanguage)是面向对象软件的标准化建模 ...

  5. 必读!53个Python经典面试题详解

    作者 | Chris 翻译 | 苏本如,编辑 | 夕颜 题图 | 视觉中国 出品 | AI科技大本营(ID:rgznai100) 本文列出53个Python面试问题,并且提供了答案,供数科学家和软件工 ...

  6. python中bytearray和java中byte[]的区别_Python经典面试题:说说Python中xrange和range的区别?...

    昨晚一小伙后台问xrange和range有啥区别,讲了下他倒领悟的挺快,其实这也是你各面试Python岗位,经常会遇到的Python面试题,长个心眼哈,说不定明年3月你找工作就用上了. 废话不多说,开 ...

  7. 用python画奥迪标志_不知道不 OK!53 个 Python 经典面试题详解

    作者 | Chris 翻译 | 苏本如,责编 | 夕颜 头图 | CSDN付费下载自视觉中国 出品 | CSDN(ID:CSDNnews) 以下为译文: 本文列出53个Python面试问题,并且提供了 ...

  8. 【强烈推荐】《剑指Offer:名企面试官精讲典型编程题》一书中IT名企经典面试题

    各位程序猿: <剑指Offer> 一书源自该书作者何海涛坚持更新与编写的博客( http://zhedahht.blog.163.com/ ),该博客收集整理了大量如微软.Google等知 ...

  9. 李洪强经典面试题146-网络

    李洪强经典面试题146-网络   网络 http请求方式? 通常,HTTP的请求方式有3种,分别是:POST.GET.HEAD.POST和GET方法是用于数据发送的. POST:它将要发送的数据单独放 ...

最新文章

  1. 虞旦盛老师 的《数学分析续》课件
  2. cisco路由器基本实验之七 Standard Access-Lists with RIP (Boson NetSim)
  3. python做商品推荐系统_一种商品智能推荐系统的设计的制作方法
  4. RSA算法原理——(1)目前常见加密算法简介
  5. Caused by: java.net.UnknownHostException: ubuntu: Name or service not known
  6. ondestroy什么时候调用_尾调用和尾递归
  7. 容器开启数据服务之旅系列(二):Kubernetes如何助力Spark大数据分析 1
  8. SDK窗口中增加菜单 以及 对菜单做出相应的消息响应
  9. 查看mysql中sql语句执行时间
  10. Nginx 解决 Tomcat 集群下的 Session共享
  11. NodeJS + WebStorm 中文显示乱码
  12. 12年双11:从春雷到秋实,为复苏喝彩
  13. 从产品经理招聘信息分析现代产品经理职责
  14. 2007年考研时间安排表
  15. 多测师软件测试肖sir_金融问题(1)
  16. 盘点最适宜旅游过年的中国名城
  17. keil5 c语言函数库,C语言中KeilC51库函数大全.doc
  18. 提升大模型研究应用技能:第2期前沿讲习班报名,顶尖专家面授,多角度系统培训...
  19. 获取客户端真实IP方法
  20. (48)STM32——图片显示实验

热门文章

  1. EOS Dawn 1.0
  2. C++ Primer 5th笔记(chap 15 OOP)继承概念
  3. 近世代数--唯一分解整环上的多项式环--唯一分解整环上的多项式环还是唯一分解整环
  4. 初等数论--同余方程--同余方程组:中国剩余定理
  5. 【计算机网络笔记】计算机网络体系与参考模型
  6. Linux软件安装配置Yum源
  7. 菜鸟学前端之遍寻名师
  8. sql注入-union select
  9. 分支定界法上下界_分支定界(Branch-and-Cut)方法的逻辑
  10. frp端口映射服务器搭建