刷题总结:最大二叉树、二叉树的最大深度、验证二叉查找(搜索)树——使用python和递归法

KW45/20:了解了二叉树的概念和递归的思想,一共练习3个题目,现在总结如下。

第一题:最大二叉树,给定一个数组,二叉树的根是数组中的最大元素,左子树是通过数组中最大值左边部分构造的最大二叉树,右子树是通过数组中最大值右边部分构造的最大二叉树

  1. 思路:二叉树的根是数组中的最大元素,左子树是最大值左边部分数组的最大二叉树,右子树是最大值右边部分数组的最大二叉树。递归出口是数组为空,返回None。
  2. 代码:
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. 思路:找出左子树的最大深度和右子树的最大深度,这两个的最大值再加1就是这个二叉树的最大深度。递归出口是二叉树为空,返回0。
  2. 代码:
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))

第三题:验证二叉查找树,判断一个二叉树是不是有效的二叉查找树,即节点的左子树都小于当前节点,节点的右子树都大于当前节点,左右子树也是二叉查找树

  1. 思路:因为在练习递归,很自然地想到判断左子树和右子树是否都是二叉查找树,不是的话,返回False。但是这里有一个容易忽略的点,即左子树必须小于上一层节点,右子树必须大于上一层节点。递归出口是节点为空,返回True或者节点不满足二叉查找树的定义,返回False。
  2. 代码:
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)
        	
        	

你可能感兴趣的:(二叉树,算法,递归法,python)