java数据结构与算法之判断是否是二叉搜索树

Posted wen-pan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java数据结构与算法之判断是否是二叉搜索树相关的知识,希望对你有一定的参考价值。

一、什么是二叉搜索树

一棵二叉树中,对于所有的子树,他的左边节点一定比他小,右边节点一定比他大。这样的树就叫做二叉搜索树。

如何判断一棵树是否是二叉搜索树?

方式一:直接通过树的中序遍历,搜索二叉树使用中序遍历出来的结果一定是升序的。

方式二:可以根据二叉树的通用求解方法来求解。

  • 每个节点都可以向他的左右孩子要结果。
  • 一棵二叉搜索树的每个节点形成的子树都应该满足二叉搜索树的定义。所以我们对于每个子树都向他的左右孩子要结果,当所有的子树都是二叉搜索树时,整棵树就是二叉搜索树。

二、解法

方式一、通过中序遍历来求解

// 判断一棵树是否是二叉搜索树
public static boolean isBinarySearchTree(final TreeNode head, final LinkedList<TreeNode<Integer>> list) {
    if (head == null) {
        return true;
    }
    process(head, list);
    // 遍历list,检查list里的数据是否是严格升序的?如果是则是二叉搜索树,反之则不是
    for (int i = 0; i < list.size() - 1; i++) {
        if (list.get(i).getData() > list.get(i + 1).getData()) {
            return false;
        }
    }
    return true;
}

// 使用递归实现二叉树的中序遍历,将遍历结果加入到list中
public static void process(final TreeNode head, final LinkedList<TreeNode<Integer>> list) {
    if (head == null) {
        return;
    }
    // 递归调用左子树
    process(head.left, list);
    list.add(head);
    process(head.right, list);
}

方式二、通过向左右子树要结果的方式求解

/**
 * 判断一棵树是否是二叉搜索树
 */
public static boolean isBinarySearchTree(final TreeNode head) {
    if (head == null) {
        return true;
    }
    return isBinarySearchTreeProcess(head);
}

/**
 * 通过递归向左右孩子要结果的方式求解
 */
public static boolean isBinarySearchTreeProcess(final TreeNode<Integer> head) {

    // base case
    if (head == null) {
        return true;
    }
    // 获取到该节点的左右孩子
    final TreeNode<Integer> left = head.left;
    final TreeNode<Integer> right = head.right;
    // 向左孩子要结果
    final boolean leftResult = isBinarySearchTreeProcess(left);
    // 向右孩子要结果
    final boolean rightResult = isBinarySearchTreeProcess(right);

    // 左右孩子都是二叉搜索树
    if (leftResult && rightResult) {
        // 该节点的左右孩子都为空的情况,则该节点一定是二叉搜索树
        if (left == null && right == null) {
            return true;
        }
        // 有左孩子没有右孩子的情况
        if (left != null && right == null) {
            return head.data > left.data;
        }
        // 有右孩子没有左孩子的情况
        if (left == null && right != null) {
            return head.data < right.data;
        }
        // 左右孩子都有的情况
        if (left != null && right != null) {
            return head.data > left.data && head.data < right.data;
        }
        // 其余情况一律返回false
        return false;
    }
    return false;
}

以上是关于java数据结构与算法之判断是否是二叉搜索树的主要内容,如果未能解决你的问题,请参考以下文章

二十一:判断二叉树是否是二叉查找树?

判断一棵树是否是二叉搜索树

剑指offer计划15( 搜索与回溯算法中等)---java

Java 求解验证二叉搜索树

java数据结构与算法之判断是否是完全二叉树

根据一个数组,判断是否是二叉搜索树的后序遍历序列