95. 验证二叉查找树

中文English

给定一个二叉树,判断它是否是合法的二叉查找树(BST)

一棵BST定义为:

  • 节点的左子树中的值要严格小于该节点的值。
  • 节点的右子树中的值要严格大于该节点的值。
  • 左右子树也必须是二叉查找树。
  • 一个节点的树也是二叉查找树。

Example

样例 1:

输入:{-1}
输出:true
解释:
二叉树如下(仅有一个节点):
-1
这是二叉查找树。

样例 2:

输入:{2,1,4,#,#,3,5}
输出:true
解释:
二叉树如下:
2
/ \
1 4
/ \
3 5
这是二叉查找树。
"""
Definition of TreeNode:
class TreeNode:
def __init__(self, val):
self.val = val
self.left, self.right = None, None
""" class Solution:
"""
@param root: The root of binary tree.
@return: True if the binary tree is BST, or false
"""
_is_bst = True
_last_val = -float('inf') def isValidBST(self, root):
# write your code here
self.helper(root)
return self._is_bst def helper(self, root):
if not root:
return
self.helper(root.left)
if root.val <= self._last_val:
self._is_bst = False # return
self._last_val = root.val
self.helper(root.right)

  

需要在遍历中记住上次遍历节点,根据上次的节点和当前节点进行比较而得到result的算法模板:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution():
   last_node = None
   result = None
    
   def run(self, root):
        self.dfs(root)
        return self.result
    
   def dfs(self):
       if last_node is None:
           last_node = root
       else:
           do_sth(last_node, root)
            
       dfs(root.left)
 
       dfs(root.right)

算法——dfs 判断是否为BST的更多相关文章

  1. [二叉树算法]关于判断是否为BST的算法

    //判断是否为BST 搜索树==二叉排序树 1.递归知最大最小值.2.先中序判是否单调 bool IsValidBST(BTNode *p,int low,int high){ if(p==NULL) ...

  2. DFS判断连通图

    因为是连通图,所以从任意一点出发,一定可以通过一遍深度优先遍历就能走过所有的点和边,就可以利用这个性质来很容易的通过DFS判断图是否为连通图 下面是具体算法:

  3. C#算法之判断一个字符串是否是对称字符串

    记得曾经一次面试时,面试官给我电脑,让我现场写个算法,判断一个字符串是不是对称字符串.我当时用了几分钟写了一个很简单的代码. 这里说的对称字符串是指字符串的左边和右边字符顺序相反,如"abb ...

  4. 广度优先算法(BFS)与深度优先算法(DFS)

    一.广度优先算法BFS(Breadth First Search) 基本实现思想 (1)顶点v入队列. (2)当队列非空时则继续执行,否则算法结束. (3)出队列取得队头顶点v: (4)查找顶点v的所 ...

  5. Java实现 蓝桥杯 算法提高 判断名次

    算法提高 判断名次 时间限制:1.0s 内存限制:256.0MB 问题描述 某场比赛过后,你想要知道A~E五个人的排名是什么,于是要求他们每个人说了一句话.(经典的开头---_-!)得了第1名的人23 ...

  6. 二分图学习——基础dfs判断二分图

    #include <iostream> #include <cstdio> #include <string.h> #include <vector> ...

  7. 回溯算法 DFS深度优先搜索 (递归与非递归实现)

    回溯法是一种选优搜索法(试探法),被称为通用的解题方法,这种方法适用于解一些组合数相当大的问题.通过剪枝(约束+限界)可以大幅减少解决问题的计算量(搜索量). 基本思想 将n元问题P的状态空间E表示成 ...

  8. 从一段简单算法题来谈二叉查找树(BST)的基础算法

    先给出一道很简单,喜闻乐见的二叉树算法题: 给出一个二叉查找树和一个目标值,如果其中有两个元素的和等于目标值则返回真,否则返回假. 例如: Input: 5 / \ 3 6 / \ \ 2 4 7 T ...

  9. POJ-1469 COURSES ( 匈牙利算法 dfs + bfs )

    题目链接: http://poj.org/problem?id=1469 Description Consider a group of N students and P courses. Each ...

随机推荐

  1. linux_权限小练习

    下面是解释: 当前# root用户, ls列出列表 mkdir 新建目录 赋予目录744权限      对others来说是  r--  只可读 touch 新建在目录下的同名文件 赋予文件600权限 ...

  2. html5 audio标签切换播放音乐的方法

    html5 audio标签切换播放音乐的方法<pre><audio id="music1" preload loop="loop">&l ...

  3. mapreduce 变量共享

    mapreduce 全局变量共享 在编写MapReduce程序时,经常会遇到这样的问题,全局变量如何保存?如何让每个处理都能获取保存的这些全局变量?使用全局变量是不可避免的,但是 在MapRdeuce ...

  4. Python3版本号比较代码实现

    一.版本号比较的困难 不能直接以字符串形式进行比较:对于1.3和1.4直接以字符串进行比较是可以正确得出1.4比1.3大:但如果是1.3和1.14还直接进字符串比较那就是1.3比1.14大那就不对了. ...

  5. C语言注释风格

    注释风格 一.前言 注释是源码程序中非常重要的一部分,一般情况下,源程序有效注释量必须在20%以上. 注释的原则是有助于对程序的阅读理解,所以注释语言必须准确.易懂.简洁,注释不宜太多也不能太少,注释 ...

  6. golang面对对象

  7. deepin安装卡在deepin标志界面解决方案

    再次重启前将U盘插上,进系统前按快速选择启动装置F12(不同品牌电脑可能不同),选择从U盘启动: 进入第一个安装界面时一定要注意:在跳转前,按E进入grub设置界面,移动光标到倒数第二行的”quiet ...

  8. 『正睿OI 2019SC Day6』

    动态规划 \(dp\)早就已经是经常用到的算法了,于是老师上课主要都在讲题.今天讲的主要是三类\(dp\):树形\(dp\),计数\(dp\),\(dp\)套\(dp\).其中计数\(dp\)是我很不 ...

  9. Java的常用API

    Object类 1.toString方法在我们直接使用输出语句输出对象的时候,其实通过该对象调用了其toString()方法. 2.equals方法方法摘要:类默认继承了Object类,所以可以使用O ...

  10. CSAPP第二章show_bytes函数的探究

    CSAPP第二章中给出了一个帮助我们观察数据的位模式的函数--show_bytes函数,具体实现如下: #include<stdio.h> typedef unsigned char *b ...