平衡二叉树

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) 


以上仅是个人思路解法,觉得还不错欢迎点赞关注分享


往期精彩推荐




扫描下方二维码,关注公众号,更多精彩等你发现





以上是关于平衡二叉树的主要内容,如果未能解决你的问题,请参考以下文章

什么是平衡二叉树

[数据结构4.8]平衡二叉树

平衡二叉树的介绍

树总结(二)平衡二叉树

平衡二叉树的操作(高手进)

平衡二叉树的问题!