Java 二叉树的水平遍历

Java 二叉树的水平遍历,java,tree,binary-search-tree,traversal,Java,Tree,Binary Search Tree,Traversal,有没有什么方法可以遍历这棵树,让我打印出包含每个节点级别的二叉树?假设我有一棵树: 10 /\ 5 15 / /\ 2 12 16 并且输出(例如,在预排序中)将是: 节点(级别) 10(0)、5(1)、2(2)、15(1)、12(2)、16(2) 最理想的方式是使用二进制方式: 10([])、5([1])、2([11])、15([0])、12([01])、16([00])是的,这是绝对可能的。看起来您希望以深度优先的顺序遍历树,这使得事情变得简单而美好 该算法

有没有什么方法可以遍历这棵树,让我打印出包含每个节点级别的二叉树?假设我有一棵树:

   10
   /\
  5  15
 /    /\
2    12 16
并且输出(例如,在预排序中)将是:

节点(级别)

10(0)、5(1)、2(2)、15(1)、12(2)、16(2)

最理想的方式是使用二进制方式:


10([])、5([1])、2([11])、15([0])、12([01])、16([00])是的,这是绝对可能的。看起来您希望以深度优先的顺序遍历树,这使得事情变得简单而美好

该算法类似于以下内容(在伪代码中,因为没有提供代码供参考):


因此,只需调用传递树的根节点和初始深度(0)的方法即可。

是的,有一种方法。你试过什么?你用在二叉树上的代码在哪里?问题是它没有打印级别,还是你在寻找一个二进制trre实现,在打印时也打印级别?我试过预排序,但是如果不将节点级别的信息实际存储在节点中,我不知道如何执行此操作。显示二进制树的代码我正在文件中实现哈希二进制树。我们散列数据并遍历树,直到到达外部节点,然后将其保存在那里。我只允许在节点的类中存储节点的子节点和父节点。是否可以在不使用递归的情况下执行此操作?是的,这是可能的,但代码会更长,更难理解。如果您没有不使用递归的特定要求,那么递归是普遍接受的遍历树的方式。我确实有不使用递归的特定要求,因为我处理大量数据,其中树存储在内存中,数据存储在file.dat的块中。此时,我正试图将树从内存保存到.txt或二进制文件中。我被告知递归会大大降低速度。递归的问题(用非常基本的术语)是,每次调用一个方法时,它都会被添加到调用堆栈中,以便在调用方法执行完毕后可以返回到调用方法。对于递归,您多次调用同一个方法,因此使用这些方法填充堆。因此,这不一定是速度问题,而是内存问题(可能导致速度问题)。递归算法几乎总是有一种迭代方法,但折衷是其他开发人员不太清楚这一点,因此可维护性可能会受到影响。因此,为了回答这个问题,我假设您已经有了一个迭代实现,这是您一直坚持的深度问题,只需遵循上述算法的要点即可。当你走下一个关卡时,深度会增加,当你走上一个关卡时,深度会减少。
void traverse(node, depth) {
  print(node.value, depth);
  depth++;
  traverse(node.leftChild, depth);
  traverse(node.rightChild, depth);
  depth--;
}