广告
返回顶部
首页 > 资讯 > 前端开发 > html >如何使用LeetCode二叉树
  • 434
分享到

如何使用LeetCode二叉树

2024-04-02 19:04:59 434人浏览 八月长安
摘要

这篇文章主要讲解了“如何使用LeetCode二叉树”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用LeetCode二叉树”吧!树首先看看什么是树??。

这篇文章主要讲解了“如何使用LeetCode二叉树”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用LeetCode二叉树”吧!

首先看看什么是树??。

如何使用LeetCode二叉树

如图,这种有节点的结构就是树。

树 是n(n>=0)个结点的有限集

其中:

  • 每个元素叫做 节点

  • 上一节是下一节的 父节点,比如1是2的父节点

  • 最上面的节点,也就是没有父节点的节点叫做 根节点,比如1

  • 同一个父节点的节点叫做 兄弟节点,比如2、3、4是兄弟节点

  • 没有子节点的节点叫做 叶子节点

二叉树

听名字还是比较好理解的,就是每个节点有两个分叉的树。但是又不要求一定有两个节点,只要小于等于2个节点就可以。

比如这种:

如何使用LeetCode二叉树

其中,可以看到绿色的树每个节点都有左右两个节点,这种二叉树就叫做 满二叉树。

还有一种二叉树叫做 完全二叉树。

完全二叉树:  对一颗具有n个结点的二叉树按层编号,如果编号为i(1<=i<=n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中位置完全相同,则这棵二叉树称为完全二叉树。

啥意思呢,比如一个满二叉树,每个节点进行顺序编号,如果去了一些节点,编号不会变化,那么就是完全二叉树,比如:

如何使用LeetCode二叉树

这张图中,绿色树是满二叉树,当去掉7号节点,变成了黄色树。

这颗黄色树的序号相对于满二叉树的序号都能一一对应,所以这个黄色树就是完全二叉树。

如果去掉的是6号节点,变成红色树,这时候,红色树的节点就必须有所变化了,6消失后节点7必须变成节点6才正确。

所以这个红色树就不是完全二叉树,因为它相对于满二叉树序号有所改变,已经对应不上了。

算法&mdash;&mdash;平衡二叉树

说了这么多,该来个题练练手了。

输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。

示例 1: 给定二叉树 [3,9,20,null,null,15,7]

  3  / \ 9  20   /  \  15   7

返回 true 。

解析

题目给出了平衡二叉树的概念,就是任意节点的左右子树相差不超过1,就是平衡二叉树。

那这个深度是啥呢?

深度就是根节点到当前节点经过的边个数

层数就是当前节点在第几层,跟节点为第一层,所以层数=深度+1

 1       深度 0 ,层数 1  / \ 2  3      深度 1 ,层数 2   /  \  4    5   深度 2 ,层数 3

解法1

首先容易想到的就是把每个节点的深度都算出来,然后进行左右节点比较就能得出是不是平衡二叉树。

那么节点的子树深度怎么计算呢?

递归。当子节点为空就返回,否则每次增加一个单位深度。

      private int depth(Treenode root) {         if (root == null) return 0;         return Math.max(depth(root.left), depth(root.right)) + 1;     }

深度搞定了,这题就好解了,即遍历每个节点的左右深度,还是要 用到递归:

class Solution {     public boolean isBalanced(TreeNode root) {         if (root == null) return true;         return Math.abs(depth(root.left) - depth(root.right)) <= 1 && isBalanced(root.left) && isBalanced(root.right);     }      private int depth(TreeNode root) {         if (root == null) return 0;         return Math.max(depth(root.left), depth(root.right)) + 1;     } }

从根节点开始,计算每个左子树深度和右子树深度的差值,以及下面的每个节点的左子树和右子树深度,最终得出结果。

这种先处理节点,在处理左子树,再处理右子树 的遍历方式叫做 前序遍历或者先序遍历。

时间复杂度

假设节点总数为n,层数为x,二叉树为满二叉树。

时间复杂度计算可以通过 每层的时间复杂度 * 层数复杂度

每层的时间复杂度:

  • 第一层需要遍历n次,第二层需要遍历n-1次,第三层需要遍历n-3次,所以每层的时间复杂度为O(n)

层数复杂度:

  • 第一层为1个节点,第二层为2个节点,第三层为4个节点,第x层为2的x-1次方。

借助公式:

n >= 1+2+4+8+...+2^(x-2)+1 n <= 1+2+4+8+...+2^(L-2)+2^(L-1)

计算:

n >= 1+2+4+8+...+2^(x-2)+1 n >= (2^(x-1)-1) + 1  n >= 2^(x-1) x <= log2n+1

同理:

x >= log2(n+1)

所以一个接近平衡二叉树的高度(层数)接近logn。

所以总的时间复杂度就是 O(nlogn)

空间复杂度

由于用到了递归,用到了堆栈帧,之前说过和最大递归深度成正比,所以空间复杂度为O(n)

解法2

还有没有更好的解呢?

刚才我们用到的是先序遍历,但是可以发现,每个节点都会计算一遍深度,会有大量重复计算,所以我们可以试试不重复的算法?比如直接后序遍历。

后序遍历:对于任意节点来说,先处理左子树,再处理右子树,最后再处理节点本身。

计算深度还是用到刚才的方法:

private int depth(TreeNode root) {       if (root == null) return 0;       int left = recur(root.left);       int right = recur(root.right);       return Math.max(left, right) + 1;   }

如果能计算左子树深度和右子树深度,那么我们可以直接进行比较,如果发现某个节点的左子树深度和右子树深度相差大于1,那么就可以直接返回false了。

所以综合能得出解法二:

class Solution {     public boolean isBalanced(TreeNode root) {         return recur(root) != -1;     }      private int recur(TreeNode root) {         if (root == null) return 0;         int left = recur(root.left);         if(left == -1) return -1;         int right = recur(root.right);         if(right == -1) return -1;         return Math.abs(left - right) < 2 ? Math.max(left, right) + 1 : -1;     } }

时间复杂度

n为总节点,遍历所有节点,所以时间复杂度为O(n)

空间复杂度

O(n)

感谢各位的阅读,以上就是“如何使用LeetCode二叉树”的内容了,经过本文的学习后,相信大家对如何使用LeetCode二叉树这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 如何使用LeetCode二叉树

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

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

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

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

下载Word文档
猜你喜欢
  • 如何使用LeetCode二叉树
    这篇文章主要讲解了“如何使用LeetCode二叉树”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用LeetCode二叉树”吧!树首先看看什么是树。如图...
    99+
    2022-10-19
  • LeetCode题解之如何重建二叉树
    本篇内容主要讲解“LeetCode题解之如何重建二叉树”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“LeetCode题解之如何重建二叉树”吧!题目输入某二叉树的...
    99+
    2022-10-19
  • C++实现LeetCode(110.平衡二叉树)
    [LeetCode] 110.Balanced Binary Tree 平衡二叉树 Given a binary tree, determine if it is height-ba...
    99+
    2022-11-12
  • C++使用LeetCode实现独一无二的二叉搜索树
    这篇文章主要介绍C++使用LeetCode实现独一无二的二叉搜索树,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完![LeetCode] 96. Unique Binary Search Trees 独一无二的二叉搜索树...
    99+
    2023-06-20
  • 怎么使用二叉树
    这篇文章主要介绍“怎么使用二叉树”,在日常操作中,相信很多人在怎么使用二叉树问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用二叉树”的疑惑有所帮助!接下来,请跟着小编一...
    99+
    2022-10-19
  • C++如何实现LeetCode之复原二叉搜索树
    这篇文章给大家分享的是有关C++如何实现LeetCode之复原二叉搜索树的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。[LeetCode] 99. Recover Binary Search Tree 复原二叉搜...
    99+
    2023-06-20
  • C++实现LeetCode(113.二叉树路径之和之二)
    [LeetCode] 113. Path Sum II 二叉树路径之和之二 Given a binary tree and a sum, find all root-to-leaf ...
    99+
    2022-11-12
  • C++实现LeetCode(107.二叉树层序遍历之二)
    [LeetCode] 107. Binary Tree Level Order Traversal II 二叉树层序遍历之二 Given the root of ...
    99+
    2022-11-12
  • C++实现LeetCode(112.二叉树的路径和)
    [LeetCode] 112. Path Sum 二叉树的路径和 Given a binary tree and a sum, determine if the tree has a...
    99+
    2022-11-12
  • C++实现LeetCode(98.验证二叉搜索树)
    [LeetCode] 98. Validate Binary Search Tree 验证二叉搜索树 Given a binary tree, determine if it is ...
    99+
    2022-11-12
  • C++实现LeetCode(99.复原二叉搜索树)
    [LeetCode] 99. Recover Binary Search Tree 复原二叉搜索树 Two elements of a binary search tree (BST...
    99+
    2022-11-12
  • C++实现LeetCode(102.二叉树层序遍历)
    [LeetCode] 102. Binary Tree Level Order Traversal 二叉树层序遍历 Given a binary tree, return the&#...
    99+
    2022-11-12
  • C++使用LeetCode实现二叉搜索树的示例分析
    这篇文章将为大家详细讲解有关C++使用LeetCode实现二叉搜索树的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Given an integer n, generate all st...
    99+
    2023-06-20
  • C++二叉搜索树BSTree如何使用
    这篇文章主要介绍“C++二叉搜索树BSTree如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++二叉搜索树BSTree如何使用”文章能帮助大家解决问题。一、概念二叉搜索树又称二叉排序树,它...
    99+
    2023-07-05
  • 如何使用Java的平衡二叉树
    这篇文章主要讲解了“如何使用Java的平衡二叉树”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用Java的平衡二叉树”吧!二叉排序树可能的问题给定一个数列{1,2,3,4,5,6},要...
    99+
    2023-06-15
  • C++实现LeetCode(96.独一无二的二叉搜索树)
    [LeetCode] 96. Unique Binary Search Trees 独一无二的二叉搜索树 Given n, how many structurally un...
    99+
    2022-11-12
  • C++实现LeetCode(95.独一无二的二叉搜索树之二)
    [LeetCode] 95. Unique Binary Search Trees II 独一无二的二叉搜索树之二 Given an integer n, generate...
    99+
    2022-11-12
  • C++实现LeetCode(173.二叉搜索树迭代器)
    [LeetCode] 173.Binary Search Tree Iterator 二叉搜索树迭代器 Implement an iterator over a binary sea...
    99+
    2022-11-12
  • C++实现LeetCode(94.二叉树的中序遍历)
    [LeetCode] 94. Binary Tree Inorder Traversal 二叉树的中序遍历 Given a binary tree, return the ...
    99+
    2022-11-12
  • C++实现LeetCode(144.二叉树的先序遍历)
    [LeetCode] 144. Binary Tree Preorder Traversal 二叉树的先序遍历 Given a binary tree, return the...
    99+
    2022-11-12
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作