1
0
mirror of https://github.com/SunnyQjm/algorithm-review.git synced 2026-06-03 08:16:43 +08:00
Files
algorithm-review/chapter10/2_balanced-binary-tree.py
T
2020-06-29 11:58:15 +08:00

70 lines
1.8 KiB
Python

#!/usr/bin/env python
# coding=utf-8
#######################################################################################
# Leetcode 110 平衡二叉树
#
# 给定一个二叉树,判断它是否是高度平衡的二叉树。
# 本题中,一棵高度平衡二叉树定义为:
# 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
#
# 示例 1:
# 给定二叉树 [3,9,20,null,null,15,7]
#
# 3
# / \
# 9 20
# / \
# 15 7
# 返回 true 。
#
# 示例 2:
# 给定二叉树 [1,2,2,3,3,null,null,4,4]
#
# 1
# / \
# 2 2
# / \
# 3 3
# / \
# 4 4
# 返回 false。
#######################################################################################
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
def __repr__(self):
if self:
return "{}->{}->{}".format(self.val, repr(self.left), repr(self.right))
class Solution:
def isBalanced(self, root):
"""
:type root: TreeNode
:rtype bool
(knowledge)
思路:
1. 直接递归计算每个节点左右子树的高度;
2. 根据AVL树的特性,如果任意一个节点的左右子树的高度差大于一,则该树不是AVL树,标记器高度为-1;
3. 如果某个子树的高度计算为-1,则表示该子树不是AVL树,-1会一直传递到顶层。
"""
def preOrderTraversal(root):
if not root:
return 0
leftNum = preOrderTraversal(root.left)
rightNum = preOrderTraversal(root.right)
if leftNum == -1 or rightNum == -1 or abs(leftNum - rightNum) > 1:
return -1
return 1 + max(leftNum, rightNum)
return preOrderTraversal(root) != -1