zoukankan      html  css  js  c++  java
  • 算法笔记-判断是否二叉搜索树

      二叉搜索树定义:二叉查找树(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其实还是初始的值,因此必须使用一个全局变量形式的值来保存,因此改为数组形式或者任意形式的全局唯一变量都可以。

  • 相关阅读:
    配置java环境变量
    编写Java中的第一个Java程序:HelloWorld(你好世界:问世)
    对Java的加载与执行的理解(理论比较重要)
    JDK、JRE、JVM三者之间的关系?
    Java语言的特性
    计算机编程语言发展史
    DRF解析器
    DRF分页组件
    DRF频率组件
    DRF权限组件
  • 原文地址:https://www.cnblogs.com/gmt-hao/p/14939211.html
Copyright © 2011-2022 走看看