【问题标题】:Find root from any node in a BST从 BST 中的任何节点查找根
【发布时间】:2013-06-16 12:11:43
【问题描述】:

如何从任何给定节点找到二叉搜索树的根?更具体地说,从任何给定节点遍历祖先时,我应该什么时候停止? java中有没有获取root的函数?请帮帮我。

【问题讨论】:

    标签: java algorithm data-structures binary-search-tree treenode


    【解决方案1】:

    这里是java中的二叉树节点表示

    class Node{
        int data;
        Node leftChild;
        Node rightChild;
    }
    

    但是,如果我们遵循这种节点表示,那么就很难从叶节点遍历到它们的祖先。这种表示适用于与问题陈述一起给出对根节点的引用的问题。

    为了从树中任意位置的节点开始遍历,我们必须在节点类中放置对父节点的引用。

    class Node{
        int data;
        Node parent;
        Node leftChild;
        Node rightChild;
    }
    

    现在,如果您开始遍历,则必须在找到节点的 null parent 时停止。

    /* the logic for traversing */
    Node tempRoot = given node;
    while(true){
        if(null != tempRoot.parent){
            tempRoot = tempRoot.parent;
    
        }else{
            break;
        }
    }
    /* return value of tempRoot: this is your root */
    

    [编辑:我省略了 getter 和 setter。虽然我不建议这样实现:)]

    【讨论】:

      【解决方案2】:

      我假设您正在用 Java 或其他类似的方式编写自己的 BST 实现?如果节点存储了对父节点的引用,最终您会在爬上树时遇到父节点为 null 的节点。这个节点通常应该是根节点。

      如果你的节点没有存储这样的引用,那么如果你只有一个节点,就没有办法到达根目录。许多实现缺少对父节点的引用,因为它可以节省内存,并且可以在遍历树时使用堆栈来处理(用于深度优先遍历)。

      但我不清楚你到底想做什么。为什么要找根节点?

      【讨论】:

        【解决方案3】:

        如果您已经实现了自己的 BST,那么您的 BST 类中应该有一个数据成员 Node root;,您可以通过简单地从 BST 类的任何方法访问该数据成员来访问/查找根

        【讨论】:

          猜你喜欢
          • 2016-10-24
          • 1970-01-01
          • 2021-10-23
          • 1970-01-01
          • 1970-01-01
          • 2014-12-15
          • 2013-01-16
          • 2022-07-25
          • 1970-01-01
          相关资源
          最近更新 更多