题目来源:力扣
题目描述:
实现一个函数,检查一棵二叉树是否为二叉搜索树。
审题:
此题我们可以依靠二叉搜索树的特性:二叉搜索树的中序遍历序列为递增序列.
因此,我们对树中节点进行中序遍历,依次判断当前节点是否满足递增要求即可.如果当前节点值小于等于其前驱节点值,则当前二叉树不是二叉搜索树,否则,继续遍历后序节点.
我们也可以将当前节点与其后继节点依次进行比较,但如果使用左中右这样的中序遍历序列,保存后继节点的步骤是较为麻烦的.如果我们使用右中左这样的中序遍历序列,便可以容易地保存后继节点,这相对于我们从右向左判断序列中的每一节点是否符合递增要求.
java算法实现:
与前驱节点进行比较(左中右遍历)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
//中序遍历每一节点,将当前节点与其前驱节点进行比较
TreeNode prev = null; //记录当前节点的前驱节点
private boolean inOrder(TreeNode x){
if(x == null)
return true;
boolean left = inOrder(x.left);
if(left == false)
return false;
if(prev != null && x.val <= prev.val)
return false;
prev = x; //判断当前节点后,当前节点成为前驱动节点
return inOrder(x.right);
}
public boolean isValidBST(TreeNode root) {
return inOrder(root);
}
}
与后驱节点进行比较(右中左遍历)
class Solution {
//中序遍历每一节点,将当前节点与其后继节点进行比较
TreeNode next = null;
private boolean inOrder(TreeNode x){
if(x == null)
return true;
boolean right = inOrder(x.right);
if(right == false)
return false;
if(next != null && x.val >= next.val)
return false;
next = x; //更新后继节点
return inOrder(x.left);
}
public boolean isValidBST(TreeNode root) {
return inOrder(root);
}
}