Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中遍历二叉树的所有节点_Java_Binary Tree_Traversal_Tree Traversal - Fatal编程技术网

在Java中遍历二叉树的所有节点

在Java中遍历二叉树的所有节点,java,binary-tree,traversal,tree-traversal,Java,Binary Tree,Traversal,Tree Traversal,假设我有一个简单的二叉树节点类,如下所示: public class BinaryTreeNode { public String identifier = ""; public BinaryTreeNode parent = null; public BinaryTreeNode left = null; public BinaryTreeNode right = null; public BinaryTreeNode(BinaryTreeNode p

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

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

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

例如:

考虑以下二叉树:

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

代码示例:

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

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

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

这看起来很像下面的正确答案。@PeterWooster-对,除了我从每个节点调用遍历方法,导致每个节点递归发生,而不仅仅是从根+1,递归总是树的答案。有趣的答案是不用递归就可以做到这一点。@Peter Wooster迭代解更难理解,特别是对于初学者,所以我想为什么要复杂化。我同意,几年前我在assembler中写过类似的东西,当然它使用了一个堆栈。我知道我很接近,但也有点不对劲。谢谢你告诉我,还有+1education@PeterWooster你在asm里做的??尊敬!!