KW45/20:了解了二叉树的概念和递归的思想,一共练习3个题目,现在总结如下。
第一题:最大二叉树,给定一个数组,二叉树的根是数组中的最大元素,左子树是通过数组中最大值左边部分构造的最大二叉树,右子树是通过数组中最大值右边部分构造的最大二叉树
- 思路:二叉树的根是数组中的最大元素,左子树是最大值左边部分数组的最大二叉树,右子树是最大值右边部分数组的最大二叉树。递归出口是数组为空,返回None。
- 代码:
class Solution:
""" @param nums: an array @return: the maximum tree """
def constructMaximumBinaryTree(self, nums):
# Write your code here
if not nums: # 递归的出口
return None
max_val = max(nums) # 列表中的最大值
max_idx = nums.index(max_val) # 得到最大值的索引
root = TreeNode(nums[max_idx]) # 最大值是二叉树的根节点
# 根据最大值左边部分数组构造最大二叉树
root.left = self.constructMaximumBinaryTree(nums[:max_idx])
# 根据最大值右边部分数组构造最大二叉树
root.right = self.constuctMaximumBinaryTree(nums[max_idx + 1:])
return root
第二题:二叉树的最大深度,给定一个二叉树,找出其最大深度
- 思路:找出左子树的最大深度和右子树的最大深度,这两个的最大值再加1就是这个二叉树的最大深度。递归出口是二叉树为空,返回0。
- 代码:
class Solution:
""" @param root: The root of binary tree. @return: An integer """
def maxDepth(self, root):
# write your code here
if root == None:
return 0
else:
return 1+ max(self.maxDepth(root.left), self.maxDepth(root.right))
第三题:验证二叉查找树,判断一个二叉树是不是有效的二叉查找树,即节点的左子树都小于当前节点,节点的右子树都大于当前节点,左右子树也是二叉查找树
- 思路:因为在练习递归,很自然地想到判断左子树和右子树是否都是二叉查找树,不是的话,返回False。但是这里有一个容易忽略的点,即左子树必须小于上一层节点,右子树必须大于上一层节点。递归出口是节点为空,返回True或者节点不满足二叉查找树的定义,返回False。
- 代码:
class Solution:
""" @param root: The root of binary tree. @return: True if the binary tree is BST, or false """
def isValidBST(self, root):
# write your code here
# 定义一个帮助函数来判断是否满足二叉查找树的定义
def helper(root, lower=float('-inf'), upper=float('inf')):
if root == None: # 节点为空满足二叉查找树的定义
return True
val = root.val
if val <= lower or val >= upper: # 节点不在上下界内,不满足···定义
return False
# 判断左右子树是否满足···定义
if not helper(root.left, lower, val):
return False
if not helper(root.right, val, upper):
return False
return True # 如果没有找到不满足···定义的节点,返回True
return helper(root)