算法笔记-判断是否二叉搜索树

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

  我们来看一下定义:左子树小于父节点小于右子树,这咋和我之前的二叉树中序遍历一样的呢,通俗解释:二叉树中序遍历是有序增长的。

  这样就简单了啊,我都遍历出来了,遍历的时候顺带比较一下前后大小是否一一增长不就行了吗,代码:

/**
     * 中序遍历
     * @param head
     */
    public static boolean inOrderUnRecur(Node head) {

        if(head != null) {
            Stack<Node> stack = new Stack<>();
            int pre= Integer.MIN_VALUE;
            while(!stack.empty() || head != null){
                if(head != null){
                    stack.push(head);
                    head = head.left;
                }else{
                    head = stack.pop();
                    if(head.value < pre){
                        return false;
                    }
                    pre = head.value;
                    head = head.right;
                }
            }
            System.out.println();
        }
        return true;
    }

这里我增加了一个变量,记录一下前置节点的值,在原来打印的地方比较一下是否完全符合增长逻辑,一旦不符合直接返回失败,这是非递归方式的修改,递归方式的要复杂一点:

public static boolean inOrderRecur(Node head) {

        boolean[] isBST = new boolean[1];
        isBST[0] = true;
        inOrderRecur(head,new int[]{Integer.MIN_VALUE},isBST);
        return isBST[0];
    }

    /**
     * 中序遍历
     * @param head
     */
    public static void inOrderRecur(Node head, int[] pre, boolean[] isBST) {
        if (head == null) {
            return;
        }
        inOrderRecur(head.left,pre,isBST);
        System.out.print(head.value + " ");
        if(pre[0] > head.value){
            isBST[0] = false;
        }
        pre[0] = head.value;
        inOrderRecur(head.right,pre,isBST);
    }

道理是差不多的,只不过我多加了一个标识是否是搜索树,这里前置节点pre一开始我用的是int变量,后来测试发现有问题,又理了一遍,发现如下图所示2和7所在的节点其实都是使用left节点递归进入的,虽然我修改了pre的值,但是回到节点2其实还是初始的值,因此必须使用一个全局变量形式的值来保存,因此改为数组形式或者任意形式的全局唯一变量都可以。

原文地址:https://www.cnblogs.com/gmt-hao/p/14939211.html