当前位置: 首页 > 知识库问答 >
问题:

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

岳嘉容
2023-03-14

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

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

在我的币树类中,每个节点都有一个左子、右子和一个值(String)。我有三个方法,printinorder-,插入和find节点。查找节点接收一个字符串,并查看该字符串是否存储在任何节点值中。

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

我有另一个类,需要一个接一个地获取节点,但是我不确定从另一个类中获取的最佳方式是什么。我可以从类内部遍历树,但不能从不同的类遍历。

共有3个答案

荀辰钊
2023-03-14

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

仲孙英才
2023-03-14

看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;
}

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

池赞
2023-03-14

遍历二叉树中所有节点的一种方法是执行以下操作,这将启动最左侧的节点并重复迁移到当前节点的顺序后继节点:

>

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

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

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

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

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

    希望这有帮助!

  •  类似资料:
    • 这总是使只有一个out的循环: 为了返回二叉树的正确高度,您还有其他想法(或想法如何更改此代码)吗? len是树中所有节点的数目,self。Queue是具有方法高度的类的子类。

    • 在“二叉树”中,一个外部节点是一个没有任何子节点的节点,无论是左的还是右的,如果我错了,请纠正我-在“二叉树”中,一个外部节点总是空的,因为根据我的课堂讲稿,一个内部节点总是有两个子节点,即使没有创建,但我们假设该内部节点的子节点是空的。那么,如果外部节点为空,我如何访问它呢? 我将这段代码作为BST节点类的一部分编写: Last方法给我nullPointerException

    • 我是在一次采访中被问到这个问题的。 问题:给出了一个二叉树和相应子树的高度。然后我们必须按顺序找到一个特定位置的元素。 例如:树结构为:D(根节点)[subtree-size=6]-->B,F(D的子节点)[subtree-size=2]-->A,C,E,G(叶节点)[subtree-size=0]。 因此共有3个级别:级别0:D;1级:B级、F级;2级:A、C、E、G 我们必须在inorder中

    • 假设我有一个简单的二叉树节点类,如下所示: 如何添加一个能够递归遍历任何大小的树的方法,从左到右访问每个现有节点,而无需重新访问已遍历的节点? 这行得通吗?

    • class Node(object): def __init__(self, data, left=None, right=None): self.data = data self.left = left self.right = right tree = Node(1, Node(3, Node(7, Node(0)), Node(6)), Node(2, Node