📅  最后修改于: 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$,即二叉树退化成链表。