Java 迭代访问所有二叉树节点?

Java 迭代访问所有二叉树节点?,java,data-structures,binary-tree,Java,Data Structures,Binary Tree,我有一个二叉树,每个节点上都有一个单词 在另一个类中,我需要逐个访问节点,然后操纵单词。从另一个类逐个访问节点的最佳方式是什么 在我的BinaryTree类中,每个节点都有一个leftchild、rightchild和一个值(字符串)。我有三种方法,printinorder、insert和findnode。find节点接收字符串并查看该字符串是否存储在任何节点值中 public void printInOrder(Node node) { if (node != null) {

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

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

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

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

我有另一个类,需要一个接一个地访问节点,但我不确定从另一个类执行此操作的最佳方式是什么。我可以从类内遍历树,但不能从其他类遍历树。

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

有关搜索:

您可以将树排序为二进制搜索树。或者在构建树时,构建一个二进制搜索树。这将是最好的搜索方式<代码>O(logn)

搜索应该在
findNode(字符串值)
方法中实现


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

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

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;
}
公共列表节点GetAllNodes(节点根){
列表节点=新的ArrayList();
if(root!=null){
addAll(GetAllNodes(root.left));
添加(根节点);
addAll(GetAllNodes(root.right));
}
返回节点;
}

我没有编译或测试它,因此可能会有错误。

遍历二叉树中所有节点的一种方法是执行以下操作,即启动最左边的节点并重复迁移到当前节点的

  • 开始时尽量向左走,不要从树上摔下来。这是您的第一个节点

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

  • 如果节点有一个右子节点,则下降到右子节点,然后尽可能连续下降到左子节点。您将在要访问的下一个节点结束
  • 否则,重复从节点向上走到其父节点,直到从左子节点向上走到其父节点的边为止。最后是新节点
  • 这在所有节点上只需要O(n)个时间,因此这是在节点之间进行迁移的一种非常快速的方法

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


    希望这有帮助

    我们需要看到更多的代码来给你一个有意义的答案。你能发布你的二叉树类吗?将更新问题。你需要给出更多的上下文。你能改变什么?你不能改变什么?哪些字段是公共的?谢谢。我需要操作另一个类中的代码。因此,理想情况下,在BinaryTree类中有一些代码将节点逐个返回给另一个类。但据我所知,这是不可能的。你能澄清一下你到底想做什么你认为是不可能的吗?可能吧。对不起,我总是不善于解释事情。我有两门课,BinaryTree和Dictionary。在Dictionary类中,我需要从BinaryTree类中获取一个单词,并将其与另一个单词(30行长的复杂比较)进行比较,然后从树中获取第二个单词并再次进行比较。目前,我把所有的单词都存储在一个文件中,我只是在while循环中逐行读取文件。(While Line!=null)但是,我需要使用二叉树来存储单词。这都是可能的,您上面描述的哪一部分给您带来了麻烦?它将一个节点的值返回给另一个类,但在循环中这样做就是问题所在。例如,我可以轻松地将一个节点返回到另一个类,但我不确定如何跟踪已访问的节点以获取下一个节点。谢谢您的提示,但我的搜索方法目前运行良好。@Vuzuggu您对哪种方法有问题?我以为是findNode。。。你有什么问题??我迷路了…在我的另一节课上,我有一个方法。它当前从文件中读取一个单词(每行一个单词),然后根据元音和常量等将该单词与输入的单词进行比较。这是一个while(line!=null){执行比较br.readline()}我需要更改它,这样它就不会从文件中访问单词,而是从二进制文件中访问tree@Vuzuggu那么您想检查您的树中是否存在用户输入的单词?这是一个搜索问题,对吗?搜索!=横穿整棵树。如果您有正确的数据结构。是的,我的眼睛编译器告诉我,不匹配的
    ,分号丢失:今天,编写大量Python的副产品是生成分号。现在应该修好了。