平衡二叉树
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了平衡二叉树相关的知识,希望对你有一定的参考价值。
参考技术A 平衡二叉树的定义:
它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树,同时,平衡二叉树必定是二叉搜索树,反之则不一定.
问题1:
把一个升序的数组转换成平衡二叉树
对一个二叉搜索树进行中序遍历就可以得到一个升序的数组,那么反过来考虑,数组的中值即为root,然后数组分为左子树和右子树,继续进行递归即可得出结果.
问题2:
给一个二叉树,判断是否是平衡树
首先写计算二叉树高度的函数
树的高度 = max(左子树高度,右子树高度)+1
可以得到高度后对树递归求解每个节点的左右子树的高度差,如果有大于1的,则return False
二叉树--高度平衡二叉树
来源:LeetCode
难度:简单
描述:
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
示例1:
示例2:
分析:
所谓的平衡二叉树,就是根节点的左右子树的高度差在1以内,而本题中定义的高度二叉树,则要求二叉树中的每个节点都满足平衡二叉树的定义,即每个节点的左右子树高度差都在1以内
因此咱们不仅要求出根节点左右子树的高度,还要求出剩余每个节点的高度,并比较每个节点左右子树的高度差
这里分别采用自顶向下和自底向上两种方法来解,具体代码思路如下
解题
方法一:自顶向下
思路:如分析,咱们从根节点开始,挨个判断每个节点是否符合平衡二叉树定义,所以咱们需要先求出每个节点的左右子树高度,然后判断该节点左右子树高度差是否小于等于1,之后依次递归每个节点即可。
代码:
1public boolean isBalanced(TreeNode root) {
2 //树空 平衡
3 if (root == null) {
4 return true;
5 }
6 //判断根节点是否平衡 & 左右子树是否平衡
7 return Math.abs(height(root.left) - height(root.right)) <= 1
8 && isBalanced(root.left) && isBalanced(root.right);
9}
10
11public int height(TreeNode root) {
12 if (root == null) {
13 return 0;
14 }
15 //该节点的深度 = 左右子树中深度最大值 + 1
16 return Math.max(height(root.left), height(root.right)) + 1;
17}
时间复杂度:O(n2) n是节点个数,当二叉树为链表时达到n2
空间复杂度:O(n)
方法二:自底向上
思路:方法一有点类似先序遍历,先判断根节点是否平衡,再判断左右子树节点是否平衡,过程中会产生大量重复计算。
其实咱们可以和后续遍历的思路一样,先判断左右子树是否平衡,如果子树都不平衡,那就没必要再判断根节点了。
代码:
1public boolean isBalanced(TreeNode root) {
2 return height(root) >= 0;
3}
4
5public int height(TreeNode root) {
6 if (root == null) {
7 return 0;
8 }
9 int leftHeight = height(root.left);
10 int rightHeight = height(root.right);
11 if (leftHeight == -1 || rightHeight == -1) {
12 //左右子树不平衡,那么整个树肯定无法高度平衡,直接返回-1
13 return -1;
14 }
15 if (Math.abs(leftHeight - rightHeight) > 1) {
16 //左右子树高度差大于1 当前根节点不平衡,返回-1
17 return -1;
18 }
19 //左右子树平衡 且根节点平衡 返回根节点高度
20 return Math.max(leftHeight, rightHeight) + 1;
21}
时间复杂度:O(n) n是节点个数
空间复杂度:O(n)
以上仅是个人思路解法,觉得还不错欢迎点赞关注分享
往期精彩推荐
以上是关于平衡二叉树的主要内容,如果未能解决你的问题,请参考以下文章