LeetCode Java刷题笔记—98. 验证二叉搜索树

Posted 刘Java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode Java刷题笔记—98. 验证二叉搜索树相关的知识,希望对你有一定的参考价值。

98. 验证二叉搜索树

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

  1. 节点的左子树只包含 小于 当前节点的数。

  2. 节点的右子树只包含 大于 当前节点的数。

  3. 所有左子树和右子树自身必须也是二叉搜索树。

中等难度。根据定义,首先想到了中序遍历,因为中序遍历就是左中右的顺序,那么我们采用一个变量保存中序遍历前驱节点的值,然后判断当前节点的值是否小于等于前驱节点的值,如果小于,那么就不是二叉搜索树,返回false,否则中序遍历完毕就是返回true。

public boolean isValidBST( TreeNode root )

   LinkedList<TreeNode> nodes = new LinkedList<>();
   //保存中序遍历前驱节点的值
   long preVal = Long.MIN_VALUE;
   while( !nodes.isEmpty() || root != null )
      while( root != null )
         nodes.addFirst( root );
         root = root.left;
      
      root = nodes.removeFirst();
      // 如果中序遍历得到的节点的值小于等于前一个节点的值,说明不是二叉搜索树
      if( root.val <= preVal )
         return false;
      
      preVal = root.val;
      root = root.right;
   
   return true;

另一种方法是使用递归分治法。比较当前节点和前后两个节点的大小。

public boolean isValidBST( TreeNode root )

   return helper( root, Long.MIN_VALUE, Long.MAX_VALUE );


private boolean helper( TreeNode node, long min, long max )
   //递归到最底层,返回true
   if( node == null )
      return true;
   
   //当前节点的值
   int val = node.val;
   //比较
   if( ( val <= min ) || ( val >= max ) )
      return false;
   
   //比较左子节点和右子节点
   //分治 合并
   return helper( node.right, val, max ) && helper( node.left, min, val );

以上是关于LeetCode Java刷题笔记—98. 验证二叉搜索树的主要内容,如果未能解决你的问题,请参考以下文章

[JavaScript 刷题] 树 - 验证二叉搜索树, leetcode 98

LeetCode刷题98-中等-验证二叉搜索树

LeetCode刷题98-中等-验证二叉搜索树

刷题-力扣-98. 验证二叉搜索树

Leetcode刷题100天—98. 验证二叉搜索树( 二叉树)—day35

Leetcode刷题100天—98. 验证二叉搜索树( 二叉树)—day35