leetcode - 合法二叉搜索树

87 阅读2分钟

截屏2024-07-25 下午8.08.21.png

前言

利用中序遍历为升序的特点,判断一颗二叉树是否为 BST(二叉搜索树),这里使用非递归的方式实现,最终版代码通过了 leetcode

题目

截屏2024-07-25 下午8.02.19.png

必备知识

什么是二叉搜索树

二叉搜索树 (Binary Search Tree ),简称 BST

定义是:节点的左子树比当前节点小,而节点的右子树比当前节点大

怎样根据特性求解

有两种解法:

  1. 递归遍历,判断是否左子树与当前节点的值,右子树与当前节点的值,如果出现一个左子树大于等于当前节点的值就不是 BST,右子树同理
  2. 中序为升序,因为 BST 的中序遍历是升序,这是它的特点

非递归实现中序遍历

只要熟悉了中序遍历,这道题就很好解决了,中序遍历是以 左 - 根 - 右 的顺序进行遍历的,而非递归需要借助栈来实现

中序遍历的套路:

  1. 树的左边界全部入栈
  2. 出栈时打印
  3. 将节点指向右子树
public void inorderTraversal(TreeNode root){
		// 借助栈
		Stack<TreeNode> stack = new Stack<>();
		TreeNode cur = root;
		
		// 下面就是套路代码了
		while(!stack.isEmpty() || cur != null){
		  	// 左边界入栈
		  	while(cur != null){
			  stack.push(cur);
			  cur = cur.left;	
			}	
			// 打印当前节点
			cur = stack.pop();
			// 伪代码
			// println(cur);
			// 节点指向右子树
			cur = cur.right;	
		}
	}

题解

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {

    // BST 的中序遍历是升序的,利用这一点来判断
    public boolean isValidBST(TreeNode root) {
        // 使用 栈 实现非递归遍历二叉树
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;
        long inorder = Long.MIN_VALUE;
        // 开始中序的套路遍历
        while(!stack.isEmpty() || cur != null){
            while(cur != null){
                stack.push(cur);
                cur = cur.left;
            }
            cur = stack.pop();
            // 这里判断是否为升序
            if(inorder >= cur.val){
                return false;
            }

            inorder = cur.val;
            cur = cur.right;
        }
        return true;
    }
}

注意点:

开始 inorder 定义为 int,发现刚好有个用例就是 Integer.MIIN_VALUE 的值,导致提交通不过,改为 Long 类型就可以避免了