【问题标题】:Traversing through all nodes of a binary tree in JavaJava遍历二叉树的所有节点
【发布时间】:2013-03-09 02:22:47
【问题描述】:

假设我有一个简单的二叉树节点类,如下所示:

public class BinaryTreeNode {
    public String identifier = "";
    public BinaryTreeNode parent = null;
    public BinaryTreeNode left = null;
    public BinaryTreeNode right = null;

    public BinaryTreeNode(BinaryTreeNode parent, String identifier)
    {
        this.parent = parent; //passing null makes this the root node
        this.identifier = identifier;
    }

    public boolean IsRoot() {
        return parent == null;
    }
}

我将如何添加一个能够递归遍历任何大小的树的方法,从左到右访问每个现有节点,不重新访问已经遍历过的节点?

这行得通吗?:

public void traverseFrom(BinaryTreeNode rootNode)
{
    /* insert code dealing with this node here */

    if(rootNode.left != null)
        rootNode.left.traverseFrom(rootNode.left);

    if(rootNode.right != null)
        rootNode.traverseFrom(rootNode.right);
}

【问题讨论】:

  • 这看起来很像下面的正确答案。
  • @PeterWooster - 对,除了我从每个节点调用 traverse 方法,导致递归对每个节点进行递归,而不仅仅是从根节点

标签: java binary-tree traversal tree-traversal


【解决方案1】:

你可以实现三种类型的二叉树遍历:

示例:

考虑以下二叉树:

Pre-order traversal sequence: F, B, A, D, C, E, G, I, H (root, left, right)
In-order traversal sequence: A, B, C, D, E, F, G, H ,I (left, root, right)
Post-order traversal sequence: A, C, E, D, B, H, I, G, F (left, right, root)

代码示例:

从左到右遍历二叉树,不按顺序遍历二叉树:

public void traverse (Node root){ // Each child of a tree is a root of its subtree.
    if (root.left != null){
        traverse (root.left);
    }
    System.out.println(root.data);
    if (root.right != null){
        traverse (root.right);
    }
}

【讨论】:

  • +1,递归永远是树的答案。有趣的答案是无需递归即可做到这一点。
  • @Peter Wooster 迭代解决方案对于初学者来说更难理解,所以我想为什么要复杂化。
  • 我同意,几年前我在汇编器中写过类似的东西,当然它使用了堆栈。
  • 我知道我很接近,但也有一点不对劲。感谢您填写我的信息,并为教育+1
  • @Peter Wooster 你是用 asm 做的吗??尊重!!
【解决方案2】:

codeMan 是对的。遍历将访问左侧的每个节点。一旦它到达左侧的最后一个节点,它就会开始沿着右侧节点返回。这是深度优先搜索 (DFS) 遍历。因此,每个节点只被访问一次,并且算法在 O(n) 时间内运行。编码愉快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 2022-11-11
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多