使用递归和中序遍历两种方法判断是否为合法查找二叉树——python实现

LeetCode题目:合法二叉搜索树
题目链接:合法二叉搜索 树
题目描述:实现一个函数,检查一棵二叉树是否为二叉搜索树。
两种思路:
1.采用递归的的思想
2.采用中序遍历的方法
方法一:递归法
思想:对每一个节点设置左右边界,也就是大小区间。根节点root.val的大小区间为[-∞,+∞],对于左子节点father.left.val区间就是父节点左边界到父节点的值,对于右子节点father.right.val区间就是父节点的值到父节点的右边界。一旦出现不满足上述调节则返回False。代码如下:

#递归法1:
def isValidBST(self, root):
    if root == None:
        return True
    # 输入本节点、左边界、右边界,flag=0表示左子树,flag=1表示右子树
    def recurse(root, left_border, right_border):
        if root.left != None:  # 如果左子树存在
            if root.left.val > left_border and root.left.val < root.val:
                if recurse(root.left, left_border, root.val) == False:
                    return False
            else:
                return False
        if root.right != None:  # 如果存在右子树
            if root.right.val > root.val and root.right.val < right_border:
                if recurse(root.right, root.val, right_border) == False:
                    return False
            else:
                return False
        return True
    return recurse(root, -float('inf'), float('inf'))

#优化代码:
def isValidBST(root):
    def isValid(root,min,max)
        if root==None:
            return True
        if min!=None and root.val<=min:return False
        if max!=None and root.val>=max:return False
        return isValid(root.left,min,root.val) and isValid(root.right,root.val,max)
        
    return isValid(root,None,None)

方法二:中序遍历
思想:如果是二叉搜索树则中序遍历为有序。每遍历到一个新节点,判断当前节点值与前一个节点值的大小,不大于则不是二叉搜索树。

def isValidBST(self, root):
    if root == None:
        return True
    def recurse(root, pre):   #这里的pre变量必须是引用类型,不能是常量,常量没办法回溯
        if root == None:
            return True
        if recurse(root.left, pre) == False:  # 回溯
            return False
        if root.val <= pre[0]:  # 如果当前节点值不大于前一个节点值则返回False
            return False
        else:
            pre[0] = root.val
        if recurse(root.right, pre) == False:
            return False
        return True   #子树有序返回True

    return recurse(root, [-float('inf')])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值