java - 检查二叉树是否是 BST

标签 java recursion graph tree

我对以下算法感到困惑:

public static boolean checkBST(TreeNode n) {
    if (n == null) {
        return true;
    }

    // Check / recurse left
    if (!checkBST(n.left)) {
        return false;
    }

    // Check current
    if (last_printed != null && n.data <= last_printed) {
        return false;
    }
    last_printed = n.data;

    // Check / recurse right
    if (!checkBST(n.right)) {
        return false;
    }
    return true;
}

我理解中序遍历,并且理解比较当前节点的左子节点以确保它 <= 与 n.data <= last_printed 行中的父节点,但是在这个递归中我们在哪里检查是否右子项大于父项?

最佳答案

右子节点的检查方式和位置与左子节点相同。

该算法的工作原理就好像通过有序遍历打印每个节点的值,然后检查结果列表是否有序。然而,它并没有实际打印,而是在实例变量 last_printed 中维护遍历中该点最近打印的值。无论遍历过程如何进行以及到达当前节点的路径如何,标记为 //Check current 的测试都会执行正确的测试,以确定当前节点的遍历顺序是否与作为 BST 的树一致.

需要注意的关键一点是,last_printed 可能会在遍历当前节点(在遍历左子树和右子树之间)时更新。

关于java - 检查二叉树是否是 BST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32511770/

相关文章:

algorithm - 混合函数的增长顺序

c++ - 使用 Boost Graph 编写图的连通分量

c# - 在有向图中查找由某些属性隔离的子图

java - JAX-RS/JAXB JSON 到 POJO - 忽略 POJO 中不存在的 JSON 字段

java - ZK自定义列表框组件

c# - EF 递归层次结构

javascript - 换能器展平和独特

java - 鼠标监听器不适用于界面

java - 将 alfresco workdesk 与我的 java 应用程序集成,以便使用基于 Activiti 的工作流程

algorithm - 对遍历边有约束的最短路径