【问题标题】:Iteratively accessing all binary tree nodes?迭代访问所有二叉树节点?
【发布时间】:2013-01-10 23:43:30
【问题描述】:

我有一个二叉树,每个节点都有一个单词。

在另一个类中,我需要一个一个地访问节点,然后操作单词。从另一个类逐个访问节点的最佳方法是什么?

在我的 BinaryTree 类中,每个节点都有一个左孩子、右孩子和一个值(字符串)。我有三种方法,printinorder、insert 和 findnode。查找节点接受一个字符串,并查看该字符串是否存储在任何节点值中。

public void printInOrder(Node node) {
    if (node != null) {
        printInOrder(node.left);
        System.out.println(node.value);
        printInOrder(node.right);
    }

我有另一个班级,需要一个接一个地到达节点,但我不确定从另一个班级做这件事的最佳方法是什么。我可以从类中遍历树,但不能从其他类中遍历。

【问题讨论】:

  • 我们需要查看更多代码才能给您一个有意义的答案。你能发布你的二叉树类吗?
  • 将更新问题。
  • 您需要提供更多上下文。你能改变什么?你不能改变什么?哪些字段是公开的?

标签: java data-structures binary-tree


【解决方案1】:

遍历二叉树中所有节点的一种方法是执行以下操作,从最左边的节点开始并反复迁移到当前节点的inorder successor

  1. 首先尽可能向左走,不要从树上掉下来。这是您的第一个节点。

  2. 要从一个节点到应该访问的下一个节点,请执行以下操作:

    1. 如果节点有右孩子,则下降到右孩子,然后尽可能继续下降到左孩子。您在下一个要访问的节点结束。
    2. 否则,重复从节点向上走到其父节点,直到您从左子节点沿着一条边向上走到其父节点。最终到达的地方是新节点。

这最终在所有节点上只需要 O(n) 时间,因此这是一种在节点之间迁移的非常快速的方法。

为了使其工作,您需要让每个节点存储一个父指针,或者必须维护从起始节点向下到当前节点的节点路径堆栈。但是,对于合理平衡的树,这比在树中填充整个节点列表并返回它更节省空间。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    阅读 templatetypedef 的答案,这是一种更有效的方法。我介绍的方法的优点是它不需要对现有 Node 类进行任何更改,并且使用与 PrintInOrder 相同的模式。它仅依赖于 Node 类的公共属性,因此应该可以从单独的类中使用。

    public List<Node> nodes GetAllNodes(Node root) {
        List<Node> nodes = new ArrayList<Node>();
        if (root != null) {
            nodes.addAll(GetAllNodes(root.left));
            nodes.add(root);
            nodes.addAll(GetAllNodes(root.right));
        }
        return nodes;
    }
    

    我没有编译或测试这个,所以可能有错误。

    【讨论】:

    • 是的,我的眼睛编译器告诉我,无与伦比的 ) ,缺少分号。 :D
    • 忘记分号是当今编写大量 Python 的副产品。现在应该修好了。
    【解决方案3】:

    假设您有一个树类,首先编写一个首先遍历树的方法(广度/深度搜索)。在遍历中的每个节点上,假设您的节点是某种类型的对象,其中一个变量中包含一个单词,请访问该节点并更改存储的单词。基本上在您的二叉树类中编写函数让您执行此操作,并在您的其他类中调用它们。

    【讨论】:

    • 谢谢。我需要操作另一个类的代码。因此,理想情况下,在 BinaryTree 类中有一些代码将节点一个接一个地返回给另一个类。但据我了解,这是不可能的。
    • 您能否澄清一下您认为不可能的具体操作?可能是。
    • 对不起,我总是不善于解释事情。我有两个类,BinaryTree 和 Dictionary。在 Dictionary 类中,我需要从 BinaryTree 类中获取 A 单词并将其与另一个单词(30 行长的复杂比较)进行比较,然后从树中获取第二个单词并再次进行比较。目前,我将所有单词都存储在一个文件中,我只是在 while 循环中逐行读取文件。 (虽然 Line != null)但是,我需要使用二叉树来存储单词。
    • 这都是可能的,你上面描述的哪一部分给你带来了麻烦?
    • 它将一个节点的值返回给另一个类,但是在循环中这样做就是问题所在。例如,我可以轻松地将一个节点返回到另一个类,但我不确定如何跟踪我已经访问过哪些节点以获取下一个节点。
    【解决方案4】:

    用于搜索:

    您可以将树排序为二叉搜索树。或者在构建树时,构建二叉搜索树。这将是最好的搜索方式。 O(logn).

    搜索应该在你的findNode(String value)方法中实现

    或者您在执行搜索时遇到问题?

    【讨论】:

    • 感谢您的提示,但目前我的搜索方法效果很好。
    • @Vuzuggu 您对哪种方法有疑问?我以为是 findNode ......你的问题是什么?我迷路了……
    • 在我的其他课程中,我有一个方法。当前从文件中读取一个单词(每行一个单词)然后根据元音和常量等将该单词与输入的单词进行比较。这是一段时间(行!= null){做比较br.readline()我需要更改它,使其不访问文件中的单词,而是访问二叉树
    • @Vuzuggu 所以你想检查你的树中是否存在用户输入的单词?这是一个搜索问题吧? search != 遍历整棵树。如果你有正确的数据结构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多