[leetcode]#10. Balanced Binary Tree
来源:互联网 发布:mysqldump 指定数据库 编辑:程序博客网 时间:2024/06/01 20:08
题意:判断一颗二叉树是否是平衡二叉树。
解题思路:在这道题里,平衡二叉树的定义是二叉树的任意节点的两颗子树之间的高度差小于等于1。这实际上是AVL树的定义。首先要写一个计算二叉树高度的函数,二叉树的高度定义为:树为空时,高度为0。然后递归求解:树的高度 = max(左子树高度,右子树高度)+1(根节点要算上)。高度计算函数实现后,递归求解每个节点的左右子树的高度差,如果有大于1的,则return False。如果高度差小于等于1,则继续递归求解。
代码:
# Definition for a binary tree node# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: # @param root, a tree node # @return a boolean def Height(self, root): if root == None: return 0 return max( self.Height( root.left ), self.Height( root.right ) ) + 1 def isBalanced(self, root): if root == None: return True if abs( self.Height( root.left ) - self.Height( root.right ) ) <= 1: return self.isBalanced( root.left ) and self.isBalanced( root.right ) else: return False
- 为了避免节点高度的重复计算,可利用TreeNode节点结构中的val保存每个节点的高度(或用额外的字典保存),求出所有节点高度后,用思路一的方法,DFS(深度优先搜索)递归判断是否是平衡二叉树。
# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution(object): def isBalanced(self, root): """ :type root: TreeNode :rtype: bool """ if root == None: return True self.getAllDepth(root) left_depth = root.left.val if root.left else 0 right_depth = root.right.val if root.right else 0 if abs(left_depth - right_depth) <= 1: return self.isBalanced(root.left) and self.isBalanced(root.right) else: return False def getAllDepth(self, root): if root == None: return 0 root.val = 1 + max(self.getAllDepth(root.left), self.getAllDepth(root.right)) return root.val
- 在思路一和思路二的基础上,考虑一遍DFS,在求出每个节点高度的同时,判断是否是平衡二叉树。
理论上说,对每个节点的访问应该返回两个值:是否平衡、节点高度,为了节省空间,若用-1表示不平衡的状态则可省去一个变量。
# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution(object): def isBalanced(self, root): """ :type root: TreeNode :rtype: bool """ return self.dfs(root) != -1 def dfs(self, root): if root == None: return True left_depth = self.dfs(root.left) if left_depth == -1: return -1 right_depth = self.dfs(root.right) if right_depth == -1: return -1 return 1 + max(left_depth, right_depth) if abs(left_depth - right_depth) <= 1 else -1
阅读全文
0 0
- [leetcode]#10. Balanced Binary Tree
- LeetCode: Balanced Binary Tree
- [LeetCode]Balanced Binary Tree
- LeetCode Balanced Binary Tree
- [Leetcode] Balanced Binary Tree
- LeetCode : Balanced Binary Tree
- LeetCode Balanced Binary Tree
- [LeetCode] Balanced Binary Tree
- 【leetcode】Balanced Binary Tree
- [LeetCode]Balanced Binary Tree
- [LeetCode] Balanced Binary Tree
- [Leetcode]Balanced Binary Tree
- [leetcode]Balanced Binary Tree
- Leetcode: Balanced Binary Tree
- LeetCode-Balanced Binary Tree
- LeetCode - Balanced Binary Tree
- [LeetCode] Balanced Binary Tree
- LeetCode | Balanced Binary Tree
- Java时间日期格式转换
- MySQL导入sql文件出错
- DataStorage分析
- 云星数据---Apache Flink实战系列(精品版)】:Flink其他操作及内容002-Flink基于流的windowAndFunction操作001
- H2数据库使用记录
- [leetcode]#10. Balanced Binary Tree
- mt6735 [Audio App]在FM station list界面,将当前正在播放的频道标识出来
- 漫谈Hadoop的思想之源:Google
- android属性动画圆环+箭头
- C 标准库
- pod安装
- Spring中<context-param>与<init-param>的区别与作用
- CentOS7安装xrdp实现Windows桌面远程
- PHP处理textarea post上来的文本的换行符等等