树-(二叉树的最大深度、验证二叉搜索树、判断对称二叉树)

二叉树的最大深度

# -*- coding:utf-8 -*-

""" 
Author: leadingme
Mail:[email protected]
MyWebsite:leadingme.top
"""

"""
    算法要求: 给定一颗二叉树,找其最大深度
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
    说明: 叶子节点是指没有子节点的节点
    解题思路: 一般来说,有关于二叉树的问题都是使用递归解决,因为递归很容易理解,也不需要去管二叉树父节点,
子节点,孙节点等复杂关系,因此,只需要清除root节点的关系,其他的让它递归去吧
"""
class TreeNode(object):
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

class Solution(object):
    def maxDepth(self, root: TreeNode) -> int:
        """
        :param root:
        :return:
        """
        if root is None:
            return 0
        else:  # 如果根节点不为None,则进行递归调用
            return 1 + max(self.maxDepth(root.right), self.maxDepth(root.left))

验证二叉搜索数

# -*- coding:utf-8 -*-

""" 
Author: leadingme
Mail:[email protected]
MyWebsite:leadingme.top
"""

"""
    算法要求: 给定一颗二叉树,判断其是否是一颗有效的二叉搜索树
    假设一颗二叉搜索树具有如下特征:
        > 节点的左子数只包含小于当前节点的数
        > 节点的右子数只包含大于当前节点的数
        > 所有左子树和右子树自身必须也是二叉搜索树'
    示例1:
        输入:
            2
           / \
          1   3
        输出: true
    示例2: 
        输入:
            5
           / \
          1   4
             / \
            3   6
        输出: false 
        解释: 因为根节点的的值5比它的右子树的值还要大
"""
class TreeNode(object):
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

class Solution(object):
    def isValidBST(self, root: TreeNode)-> bool:
        import sys
        min = sys.maxsize * (-1)  # 求出系统所支持的最大最小值
        max = sys.maxsize
        return self.ValidBST(root, min, max)

    def ValidBST(self, root, min, max):
        if root is None:
            return True
        if root.val <= min or root.val >= max:
     	# 如果满足则返回False,否则继续执行,直到执行到最后节点为空
            return False
        # 递归调用,返回满足 左子节点的值小于父节点的值大于系统最小值 右子节点的值大于父节点的值小于系统最大值
        return self.ValidBST(root.left, min, root.val) and self.ValidBST(root.right, root.val, max)

判断对称二叉数

# -*- coding:utf-8 -*-

""" 
Author: leadingme
Mail:[email protected]
MyWebsite:leadingme.top
"""

"""
    算法要求: 给定一颗二叉树,检查它是否是镜像对称的
    示例1:
        输入:  1
              / \
             2   2
            / \  / \
           3  4  4  3
        输出: true
    示例2:
        输入:   1
               / \
              2   2
               \   \
                3   3
        输出: false
    解题思路:
        假设root.left为L节点同时root.right为R节点,所谓对称要求的是L.right=R.left and L.left=R.right
"""

class TreeNode(object):
    def __init__(self, root):
        self.val = x,
        self.left = None
        self.right = None

    def isSymmetric(self, root: TreeNode) -> bool:
        if root is None:
            return True
        else:
            return self.symmetricTree(root.left, root.right)

    def symmetricTree(self, lNode, rNode):
        if not lNode and not rNode: # 两个节点不存在也对称
            return True
        elif lNode and rNode and lNode.val == rNode.val:  # 两个节点存在且值相等
            return self.symmetricTree(lNode.right, rNode.left) and self.symmetricTree(lNode.left, rNode.right)
        else:
            return False
发布了55 篇原创文章 · 获赞 25 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_43388615/article/details/105367911