广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >LeetCode题解之如何重建二叉树
  • 487
分享到

LeetCode题解之如何重建二叉树

2024-04-02 19:04:59 487人浏览 安东尼
摘要

本篇内容主要讲解“LeetCode题解之如何重建二叉树”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“LeetCode题解之如何重建二叉树”吧!题目输入某二叉树的

本篇内容主要讲解“LeetCode题解之如何重建二叉树”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“LeetCode题解之如何重建二叉树”吧!

题目

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

例如,给出

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

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

返回如下的二叉树:

 3  / \ 9  20   /  \  15   7

题解

上周说过 前序遍历和后序遍历,其实这种前序、中序、后序都是相对于中间节点的处理顺序。

比如先序遍历的顺序就应该是:

[ 根节点 | 左子树 | 右子树 ]

同理,中序遍历的顺序就是:

[ 左子树 | 根节点 | 右子树 ]

所以前序遍历的第一个元素肯定就是 根节点。

然后,我们就能在 中序遍历找到根节点,并正确把中序遍历区分为三部分,也就是左子树中序、根节点、右子树中序。

举个例子:

如果只有三个元素,那么到这里就能结束了,因为树已经能画出来了。

比如前序是【3,9,20】,中序是【9,3,20】

我们根据中序知道了根节点3,然后在中序中就能区分出左子树节点9,根节点3,右子树节点20。

现在我们扩散开,如果不止3个节点呢?

举例2:

如果是5个元素,比如前序是[3,9,20,15,7],中序是[9,3,15,20,7]

经过第一次分割,我们把中序分成了左子树9,根节点3,右子树【15,20,7】

这时候,右子树该怎么分呢?跟节点是什么呢?又不知道了。

所以这时候要再联系到前序遍历,根据我们所知道的左子树节点,得出前序中右子树应该为【20,15,7】,所以右子树的根节点为20。

总之,就是前序和中序互相帮助,最终通过递归完成我们树的构建。

解法1

解法1就是依靠递归。

递归的过程就是找出每个父节点的左子树节点和右子树节点,一共三个值。

而最终的取值都是从前序列表中取值,其实就是取每个小树的父节点。

而中序遍历数组的作用就是找到 每次父节点在中序遍历数组中的位置。

得出如下算法

 class Solution {     int[] preorder;     HashMap<Integer, Integer> dic = new HashMap<>();     public Treenode buildTree(int[] preorder, int[] inorder) {         this.preorder = preorder;         for(int i = 0; i < inorder.length; i++)             dic.put(inorder[i], i);         return recur(0, 0, inorder.length - 1);     }     TreeNode recur(int root, int left, int right) {         if(left > right) return null;                 //根节点                           TreeNode node = new TreeNode(preorder[root]);            //分割点             int i = dic.get(preorder[root]);                 node.left = recur(root + 1, left, i - 1);          node.right = recur(root + i - left + 1, i + 1, right);          return node;           } }

其中每次取右子树的根节点需要注意:

左子树的节点数为i-left。

所以在前序遍历数组中,左子树的节点+根节点位置,就是左子树的最后一个节点位置,也就是root+i-left。

最后得出右子树的根节点为:root + i - left + 1

而递归的结束条件就是,左右子树节点相遇,也就是left>right。

时间复杂度

O(n),n为树的节点数量。

空间复杂度

O(N),用到了HashMap。

解法2

还有一种办法叫做迭代方法,这个方法挺巧妙的,当时也是看了很久的官方解答才想明白的,哈哈。

它的主要思想是理解前序遍历和中序遍历的规则,然后一个个从前序遍历中取值,并放到合适的位置。

比如以下这个二叉树:

        3        / \       9  20      /  /  \     8  15   7    / \   5  10  / 4

前序遍历,可以发现是首先把最左边的节点列出来,也就是 3,9,8,5,4

而中序列表是反着来的,从最左边的下面开始,往上列,如果发现某个节点有右子节点,就开始往右边列。

比如 4,5,8。这时候发现8有右子节点,那么就开始数 10 ,然后继续最左边往上,9,3。

最后列一下完整的前序和中序:

preorder = [3, 9, 8, 5, 4, 10, 20, 15, 7] inorder = [4, 5, 8, 10, 9, 3, 15,  20, 7]

总之,前序是从左边列开始,从上往下排。中序就是从左边列开始,从下往上排。

看看代码:

class Solution {     public TreeNode buildTree(int[] preorder, int[] inorder) {         if (preorder == null || preorder.length == 0) {             return null;         }         TreeNode root = new TreeNode(preorder[0]);         Deque<TreeNode> stack = new LinkedList<TreeNode>();         stack.push(root);         int inorderIndex = 0;         for (int i = 1; i < preorder.length; i++) {             int preorderVal = preorder[i];             TreeNode node = stack.peek();             if (node.val != inorder[inorderIndex]) {                 node.left = new TreeNode(preorderVal);                 stack.push(node.left);             } else {                 while (!stack.isEmpty() && stack.peek().val == inorder[inorderIndex]) {                     node = stack.pop();                     inorderIndex++;                 }                 node.right = new TreeNode(preorderVal);                 stack.push(node.right);             }         }         return root;     } }

if语句是为了找到左列最后一个节点,比如上述例子中的4。

while循环是当发现有右节点的时候,要找到右节点的父节点,然后添加进去。

到此,相信大家对“LeetCode题解之如何重建二叉树”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: LeetCode题解之如何重建二叉树

本文链接: https://www.lsjlt.com/news/83315.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • LeetCode题解之如何重建二叉树
    本篇内容主要讲解“LeetCode题解之如何重建二叉树”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“LeetCode题解之如何重建二叉树”吧!题目输入某二叉树的...
    99+
    2022-10-19
  • 如何使用LeetCode二叉树
    这篇文章主要讲解了“如何使用LeetCode二叉树”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用LeetCode二叉树”吧!树首先看看什么是树。如图...
    99+
    2022-10-19
  • java中如何实现重建二叉树
    题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回...
    99+
    2021-06-28
    java教程 java 重建 二叉树
  • C++如何实现LeetCode之复原二叉搜索树
    这篇文章给大家分享的是有关C++如何实现LeetCode之复原二叉搜索树的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。[LeetCode] 99. Recover Binary Search Tree 复原二叉搜...
    99+
    2023-06-20
  • CC++LeetCode题解在二叉树中增加一行示例详解
    目录题目描述整理题意解题思路分析层序遍历(广度优先搜索)递归(深度优先搜索)具体实现复杂度分析代码实现层序遍历(广度优先搜索)递归(深度优先搜索)总结题目描述 题目链接:623. 在...
    99+
    2022-11-13
    C C++ 在二叉树中增加一行 C C++ LeetCode题解
  • 如何在Python中创建二叉树
    目录前言二叉树节点定义递归构建二叉树前言 本文的内容是数据结构中二叉树部分最基础的,之所以写一下主要是为了方便刷题的时候,能够在自己电脑上很快的使用这种小的demo进行复杂的练习。...
    99+
    2022-11-12
  • java如何创建普通二叉树
    java创建二叉树 这段时间一直在复习数据结构的知识。 从最基础的开始,实现一个普通的二叉树。但发现也不那么简单。因为之前学数据结构时是用C语言写的。 指针用来对结构体的值操作比较好...
    99+
    2022-11-12
  • C++如何建立链式二叉树
    本篇内容介绍了“C++如何建立链式二叉树”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!递归建立二叉树二叉树的结构体typedef ...
    99+
    2023-07-02
  • 剑指Offer之Java算法习题精讲二叉树专项解析
    题目一 解法 class Solution { int ans; int pre; public int getMinimumDifference(T...
    99+
    2022-11-13
  • js如何构建二叉树进行数值数组的去重与优化
    这篇文章主要介绍了js如何构建二叉树进行数值数组的去重与优化,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。常见两层循环实现数组去重let&n...
    99+
    2022-10-19
  • c语言如何构建一个静态二叉树
    这篇文章主要介绍“c语言如何构建一个静态二叉树”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“c语言如何构建一个静态二叉树”文章能帮助大家解决问题。第一、树的构建定义树结构struct BT...
    99+
    2023-06-16
  • web开发中如何创建和遍历二叉树
    这篇文章给大家分享的是有关web开发中如何创建和遍历二叉树的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。0. 前言二叉树的创建及遍历的代码实现,其中包括递归遍历和栈遍历。1. 二...
    99+
    2022-10-19
  • 详解如何用c++实现平衡二叉树
    目录一、概述二、平衡二叉树不平衡的情形三、调整措施3.1、单旋转3.2、双旋转四、AVL树的删除操作五、代码实现一、概述 平衡二叉树具有以下性质:它是一 棵空树或它的左右两个子树的高...
    99+
    2022-11-12
  • Java 求解如何把二叉搜索树转换为累加树
    一、题目 给出二叉搜索树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val ...
    99+
    2022-11-12
  • 利用java如何实现创建并遍历二叉树
    利用java如何实现创建并遍历二叉树?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。用java实现的数组创建二叉树以及递归先序遍历,递归中序遍历,递归后序遍历,非递归前序遍历...
    99+
    2023-05-31
    二叉树 java 遍历
  • 详解Go语言如何实现二叉树遍历
    目录1. 二叉树的定义2. 前序遍历3. 中序遍历4. 后序遍历1. 二叉树的定义 二叉树需满足的条件 ① 本身是有序树 ② 树中包含的各个节点的长度不能超过2,即只能是0、1或者2...
    99+
    2022-11-13
  • C++如何实现由先序和后序建立二叉树
    今天小编给大家分享一下C++如何实现由先序和后序建立二叉树的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。由先序和后序遍历建立...
    99+
    2023-06-19
  • C语言如何解决二叉堆问题
    这篇文章给大家分享的是有关C语言如何解决二叉堆问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、堆的概念1、概述堆是计算机科学中一类特殊的数据结构的统称。实现有很多,例如:大顶堆,小顶堆,斐波那契堆,左偏堆,...
    99+
    2023-06-26
  • C语言线索二叉树的前中后如何创建和遍历
    这篇“C语言线索二叉树的前中后如何创建和遍历”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言线索二叉树的前中后如何创建和...
    99+
    2023-06-29
  • PHP中如何使用重定向函数解决Leetcode问题?
    Leetcode是一个非常受欢迎的在线编程平台,用于帮助人们提高他们的编程技能,提高他们的算法和数据结构知识。在Leetcode上,许多问题都需要使用重定向函数来解决。在本文中,我们将学习如何使用PHP中的重定向函数来解决Leetcode...
    99+
    2023-09-24
    leetcode 函数 重定向
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作