二分查找的应用【110平衡二叉树】+【98验证二叉搜索树】

算法原理

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法,前提是数据结构必须先排好序,可以在数据规模的对数时间复杂度内完成查找。但是,二分查找要求线性表具有有随机访问的特点(例如数组),也要求线性表能够根据中间元素的特点推测它两侧元素的性质,以达到缩减问题规模的效果。

二分查找问题也是面试中经常考到的问题,虽然它的思想很简单,但写好二分查找算法并不是一件容易的事情。

110. 平衡二叉树

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。

在这里插入图片描述

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def isBalanced(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        return self.depth(root)!=-1
    def depth(self,root):
        if not root: return 0
        treel=self.depth(root.left)
        if treel==-1 :return -1
        treer=self.depth(root.right)
        if treer==-1 :return -1
        return max(treel,treer)+1 if abs(treel - treer) < 2 else -1

在这里插入图片描述

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def isBalanced(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        if not root : return True
        return abs(self.depth(root.left)-self.depth(root.right))<=1 \
            and self.isBalanced(root.left) and self.isBalanced(root.right)
    def depth(self,root):
        if not root: return 0
        return max(self.depth(root.left)+1,self.depth(root.right)+1)

98. 验证二叉搜索树

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:

节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def isValidBST(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        if not root :return True
        return root.val>self.depth(root.left,1) and root.val<self.depth(root.right,0) and self.isValidBST(root.left)and self.isValidBST(root.right)
    def depth(self,root,num):
        if not root :
            if num==1:
                return -float("inf") 
            else :
                return float("inf") 

        if num==1:
            return max(self.depth(root.left,1),self.depth(root.right,1),root.val)
        else :
            return min(self.depth(root.left,0),self.depth(root.right,0),root.val)

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def isValidBST(self, root: TreeNode) -> bool:
        if root==None :return True
        if root.left==None and root.right==None :return True
        t=0
        if (not root.left==None) and root.val>self.findl(root.left): 
            t=t+1
        elif (not root.left==None):
            return False
        if (not root.right==None)and root.val<self.findr(root.right):
            t=t+1
        elif (not root.right==None):
            return False
        if t==2:
            return self.isValidBST(root.left) and self.isValidBST(root.right)
        elif  (not root.left==None)and (t==1):
            return self.isValidBST(root.left)
        elif  (not root.right==None)and (t==1):
            return self.isValidBST(root.right)
        else: 
            return False
    def findl(self,root:TreeNode)-> int :
        if root==None:  return float(-1000000)
        if root.left==None and root.right==None :return root.val
        return max(root.val,self.findl(root.left),self.findl(root.right))
    def findr(self,root:TreeNode)-> int :
        if root==None:  return float(1000000)
        if root.left==None and root.right==None :return root.val
        return min(root.val,self.findr(root.left),self.findr(root.right))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

和你在一起^_^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值