前言
利用中序遍历为升序的特点,判断一颗二叉树是否为 BST(二叉搜索树),这里使用非递归的方式实现,最终版代码通过了 leetcode
题目
必备知识
什么是二叉搜索树
二叉搜索树 (Binary Search Tree ),简称 BST
定义是:节点的左子树比当前节点小,而节点的右子树比当前节点大
怎样根据特性求解
有两种解法:
- 递归遍历,判断是否左子树与当前节点的值,右子树与当前节点的值,如果出现一个左子树大于等于当前节点的值就不是 BST,右子树同理
- 中序为升序,因为 BST 的中序遍历是升序,这是它的特点
非递归实现中序遍历
只要熟悉了中序遍历,这道题就很好解决了,中序遍历是以 左 - 根 - 右 的顺序进行遍历的,而非递归需要借助栈来实现
中序遍历的套路:
- 树的左边界全部入栈
- 出栈时打印
- 将节点指向右子树
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 类型就可以避免了