📜  数据结构|二叉树|问题12(1)

📅  最后修改于: 2023-12-03 15:40:00.938000             🧑  作者: Mango

问题12:检查二叉树是否为平衡二叉树

在数据结构中,二叉树是一种重要的数据结构。平衡二叉树是一种特殊的二叉树,在其中左子树和右子树的高度之差不超过1。平衡二叉树的一个例子是AVL树,其优点在于可以保证树的平衡,从而在查找、插入和删除等操作中具有良好的性能。

本文将介绍如何检查一个二叉树是否为平衡二叉树。

算法

我们可以通过递归检查每个节点的左右子树的高度,如果左右子树的高度差超过1,则该二叉树不是平衡二叉树。

代码如下:

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

class Solution:
    def isBalanced(self, root: TreeNode) -> bool:
        if root is None:
            return True
        l = self.height(root.left)
        r = self.height(root.right)
        if abs(l - r) > 1:
            return False
        return self.isBalanced(root.left) and self.isBalanced(root.right)

    def height(self, node: TreeNode) -> int:
        if node is None:
            return 0
        return max(self.height(node.left), self.height(node.right)) + 1

在上面的代码中,我们定义了一个TreeNode类,其中包含一个值、左子树和右子树。我们还定义了一个Solution类,其中包含isBalanced函数和height函数。isBalanced函数检查该二叉树是否是平衡二叉树,而height函数返回节点的高度。

复杂度分析

该算法的时间复杂度为O(nlogn),其中n为节点数。在最坏的情况下,检查每个节点的子树的高度需要O(logn)的时间,而最坏情况下的时间复杂度是O(nlogn)。

该算法的空间复杂度为O(n),其中n为节点数。最坏情况下递归需要O(n)的空间,并且每个节点都需要保存它的高度,因此空间复杂度为O(n)。

结论

在本文中,我们介绍了如何检查一个二叉树是否为平衡二叉树。我们用一个递归算法检查每个节点的左右子树的高度差,如果任何一个节点不符合平衡二叉树的定义,则整个二叉树不是平衡二叉树。我们还分析了该算法的时间和空间复杂度。