📜  给定二叉树中特殊平衡节点的总和(1)

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

题目描述

给定一棵二叉树,如果该二叉树的每个节点的左右子树高度在范围 [-1, 1] 之内,则该二叉树被称为平衡二叉树。特殊平衡节点指的是平衡二叉树中,其左右子树高度差的绝对值为1的结点。求给定二叉树中特殊平衡节点的总和。

思路

递归遍历整个二叉树,对于每个节点,分别对其左右子树进行判断是否平衡,并计算其子树的高度。如果该节点左右子树高度差的绝对值为1,则说明该节点为特殊平衡节点,将其值加入结果中。最后返回结果即可。

代码实现

Java 代码实现:

class Solution {
    public int specialBalanceNodes(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int leftHeight = getHeight(root.left);
        int rightHeight = getHeight(root.right);
        if (Math.abs(leftHeight - rightHeight) == 1) {
            return 1 + specialBalanceNodes(root.left) + specialBalanceNodes(root.right);
        } else {
            return specialBalanceNodes(root.left) + specialBalanceNodes(root.right);
        }
    }

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

Python 代码实现:

class Solution:
    def specialBalanceNodes(self, root: TreeNode) -> int:
        def getHeight(node):
            if not node:
                return 0
            return max(getHeight(node.left), getHeight(node.right)) + 1
        
        if not root:
            return 0
        leftHeight = getHeight(root.left)
        rightHeight = getHeight(root.right)
        if abs(leftHeight - rightHeight) == 1:
            return 1 + self.specialBalanceNodes(root.left) + self.specialBalanceNodes(root.right)
        else:
            return self.specialBalanceNodes(root.left) + self.specialBalanceNodes(root.right)

复杂度分析

时间复杂度:$O(nlogn)$,其中 $n$ 为二叉树的节点数。在求解每个节点的左右子树高度和判断其是否平衡时,需要遍历其所有的子节点,所以遍历的总次数为 $O(nlogn)$。

空间复杂度:$O(h)$,其中 $h$ 表示二叉树的高度。递归调用的栈空间深度取决于树的高度,最坏情况下为 $n$,即二叉树退化成链表。