专栏名称: 每日一道算法题
学习算法是一种信仰,每天都需要坚持!
目录
相关文章推荐
九章算法  ·  24秋招《leetcode大厂高频题集》,先 ... ·  4 天前  
九章算法  ·  湾区码二代,已经是next level了 ·  4 天前  
九章算法  ·  拿到小公司offer,想躺平了 ·  1 周前  
奇舞精选  ·  机器学习中的 One-Hot 编码 ·  6 天前  
51好读  ›  专栏  ›  每日一道算法题

[每日一题]如何判断一棵树是 BST ?

每日一道算法题  · 公众号  · 算法  · 2017-04-17 23:13

正文

原题


本周主题:DFS

本题难度:Medium

做题日期:2017年4月17日

98. Validate Binary Search Tree


Given a binary tree, determine if it is a valid binary search tree (BST).

Assume a BST is defined as follows:

  • The left subtree of a node contains only nodes with keys less than the node's key.

  • The right subtree of a node contains only nodes with keys greater than the node's key.

  • Both the left and right subtrees must also be binary search trees.


Example 1:

    2
   / \
  1   3

Binary tree [2,1,3], return true.


Example 2:

    1
   / \
  2   3

Binary tree [1,2,3], return false.


https://leetcode.com/problems/validate-binary-search-tree/#/description


问题分析


什么是 BST? 


如下是百度百科的定义:


二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树


    二叉搜索树是一种非常重要的数据结构,应用比较广泛。它可以通过 中序遍历,将无序的序列转变成一个递增的有序序列。它也是很多高效搜索的数据结构的基础,比如 B树,B+树 和 B* 树。


    本题是要我们判断一颗树是不是二叉搜索树。其判断方法有很多种,下面我们逐一讲解。


    解题方案


    方案一

    根据BST的定义,我们只需要判断当前树是否满足如下三个条件

    1. 当前节点的值大于它的左之树,小于它的右子树

    2. 左子树的所有节点都小于当前节点的值;右子树的所有节点都大于当前节点

    3. 左右子树也是 BST 


    代码如下


    优点

    1. 比较符合正常的逻辑思考

    2. 思路比较清晰

    缺点

    1. 代码太长了,逻辑复杂,需要考虑多种case

    2. 代码的时间复杂度有点高



    方案二

    由于树是递归定义的,所以我们只需要判断当前的节点是否在一个取值区间即可。

优点: 代码简单,逻辑清晰

缺点:不容易想到,对coder的能力要求比较高,需要对树的递归遍历比较熟悉


优化版本

使用 Long.MIN_VALUE 代码 Integer.MIN_VALUE ,不需要考虑 节点的边界值,代码更少更健壮。


方案三

利用中序遍历的特性,将树转换成一个数组,然后判断该数组是不是递增的


灵活运用中序遍历的特点:BST通过中序遍历会构建一个递增的有序序列。通过判断数组 res 是不是有序的来判断树是不是 BST。


如果对中序遍历比较了解,这种解法的思路特别简单。如果对中序遍历的特点不了解,不容易想到。


上面的代码是中序遍历的递归代码,如下的代码是中序遍历的非递归实现。



最佳提交



关于我们



每日一道算法题是一个纯粹的算法学习社区:通过每天一起做一道算法题来提升我们的算法能力。


长按下面的二维码,关注每日一道算法题公众号,跟我们一起学习算法!





相关资源




群规

《每日一题算法群》群规

[每日一题]项目宣言:一起来重复造轮子吧


代码规范

[每日一题]代码规范v1.0


树相关的问题

[每日一题]树的层次遍历的几种方法

[每日一题]222. Count Complete Tree Nodes

[每日一题]199. Binary Tree Right Side View

[每日一题]二叉树的序列化和反序列化的问题

[每日一题]LCA问题解法汇总

[每日一题]450. Delete Node in a BST


贪心算法

[每日一题]452. Minimum Number of Arrows to Burst Balloons


回溯相关

[每日一题]131. Palindrome Partitioning

[每日一题]139. Word Break

[每日一题]357. Count Numbers with Unique Digits

[每日一题]78. Subsets

[每日一题]79. Word Search


DP问题

[每日一题]343. Integer Break

[每日一题]368. Largest Divisible Subset


二分法相关的题目

[每日一题]二分法的三个区间控制套路

[每日一题]162. Find Peak Element

[每日一题]410. Split Array Largest Sum

[每日一题]209. Minimum Size Subarray Sum

[每日一题]240. Search a 2D Matrix II

[每日一题]74. Search a 2D Matrix

[每日一题]154. Find Minimum in Rotated Sorted Array II

[每日一题]174. Dungeon Game


数学相关的题目

[每日一题]264. Ugly Number II

[每日一题]202. Happy Number

[每日一题]172. Factorial Trailing Zeroes

[每日一题]483. Smallest Good Base

[每日一题]172. Factorial Trailing Zeroes


堆和栈

[周总结] stack 和 heap

[每日一题]402. Remove K Digits

[每日一题] 224. Basic Calculator

[每日一题]373. Find K Pairs with Smallest Sums

[每日一题]451. Sort Characters By Frequency

[每日一题]394. Decode String


分治算法

[每日一题]分治算法(Divid and Conquer)总结


资源共享

[资源分享]分享一套清爽的Bootstrap UI 套件

[资源分享]Python算法进阶之路


其他

面试心得

如何有效的区分小公司和创业公司

如何持续不断的成长?