leetcode(110). Balanced Binary Tree

xiaoxiao2021-02-27  177

problem

Given a binary tree, determine if it is height-balanced.

For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1.

分析

此题目要求判断一棵树是否是平衡二叉树,我采用的是类似于 leetcode(543). Diameter of Binary Tree中的解法,根据递归中左右子树的深度,判断是否满足平衡条件,缺点就是由于是递归算法,而不是循环,即使发现不满足条件也要逐层退出,因此此提交只超过了1%(去掉print后超越了50%)。

时间复杂度为 O(n) n <script type="math/tex" id="MathJax-Element-33">n</script>为节点个数。

# Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None flag = 0 class Solution(object): def isBalanced(self, root): """ :type root: TreeNode :rtype: bool """ global flag flag = 0 def depth(r): if not r: return 0 else: left = depth(r.left) right = depth(r.right) if abs(left - right) > 1: flag = 1 return 1 + max(left, right) depth(root) return True if flag == 0 else False

改进

在discussion中看到一个Java的解法可以不使用全局变量而是利用特殊的返回值进行标记,简化了代码,不过只超过3%的提交(后来发现是忘记去掉print了)。

return -1 作为特殊返回值表明已经达到某种目的,可以省去全局变量,优化递归算法时很有用。

class Solution(object): def isBalanced(self, root): """ :type root: TreeNode :rtype: bool """ def depth(r): if not r: return 0 else: left = depth(r.left) right = depth(r.right) if left == -1 or right == -1: return -1 print(left, right) if abs(left - right) > 1: return -1 return 1 + max(left, right) return True if depth(root) != -1 else False

学习别人的代码:

class Solution(object): def isBalanced(self, root): """ :type root: TreeNode :rtype: bool """ #优雅,而不是if else return self.height(root) >= 0 def height(self, root): if not root: return 0 left = self.height(root.left) right = self.height(root.right) #把多个return合并到一起 if left < 0 or right < 0 or abs(left - right) > 1: return -1 return max(left, right) + 1
转载请注明原文地址: https://www.6miu.com/read-13461.html

最新回复(0)