这个二叉树遍历算法是如何工作的?
How does this binary tree traversal algorithm work?
所以我得到了算法
void traverse(Node node) {
if (node != null) {
traverse(node.leftChild);
System.out.println(node.name);
traverse(node.rightChild);
}
}
我不明白这是怎么回事。因此,如果我处于输入为空的位置,会发生什么?
假设我们打印空节点的父节点(我不知道你是怎么到那里的)并继续,假设我们已经将节点覆盖到树的深处,我们如何爬回树上?这个算法哪里可以根据需要不断跳转到父节点?
要理解这一点,你需要先理解递归。这里对于每个节点 parent 我们对左 child 然后对右 child 做同样的事情。并在遍历左侧后打印 parent 名称。
当节点为 null 时我们什么都不做,所以不会调用 child
void traverse(Node node) {
if(node!=null) {
traverse(node.leftChild);
System.out.println(node.name);
traverse(node.rightChild);
}
}
示例:
parent and childs
1 -> 2,3
2 -> 4,5
3 -> 6,7
所以这里 traverse(1) 首先作为根调用。
traverse(1) -> traverse(2) // left
traverse(3) // right
traverse(2) -> traverse(4) // left
traverse(5) // right
traverse(3) -> traverse(6) // left
traverse(7) // right
traverse(4) -> nothing called
traverse(5) -> nothing called
traverse(6) -> nothing called
traverse(7) -> nothing called
现在确定它调用的顺序
traverse(1) -> traverse(2) // left
traverse(2) -> traverse(4) // left
traverse(4) -> nothing called
traverse(5) // right
traverse(5) -> nothing called
traverse(3) // right
traverse(3) -> traverse(6) // left
traverse(6) -> nothing called
traverse(7) // right
traverse(7) -> nothing called
所以我得到了算法
void traverse(Node node) {
if (node != null) {
traverse(node.leftChild);
System.out.println(node.name);
traverse(node.rightChild);
}
}
我不明白这是怎么回事。因此,如果我处于输入为空的位置,会发生什么? 假设我们打印空节点的父节点(我不知道你是怎么到那里的)并继续,假设我们已经将节点覆盖到树的深处,我们如何爬回树上?这个算法哪里可以根据需要不断跳转到父节点?
要理解这一点,你需要先理解递归。这里对于每个节点 parent 我们对左 child 然后对右 child 做同样的事情。并在遍历左侧后打印 parent 名称。
当节点为 null 时我们什么都不做,所以不会调用 child
void traverse(Node node) {
if(node!=null) {
traverse(node.leftChild);
System.out.println(node.name);
traverse(node.rightChild);
}
}
示例:
parent and childs
1 -> 2,3
2 -> 4,5
3 -> 6,7
所以这里 traverse(1) 首先作为根调用。
traverse(1) -> traverse(2) // left
traverse(3) // right
traverse(2) -> traverse(4) // left
traverse(5) // right
traverse(3) -> traverse(6) // left
traverse(7) // right
traverse(4) -> nothing called
traverse(5) -> nothing called
traverse(6) -> nothing called
traverse(7) -> nothing called
现在确定它调用的顺序
traverse(1) -> traverse(2) // left
traverse(2) -> traverse(4) // left
traverse(4) -> nothing called
traverse(5) // right
traverse(5) -> nothing called
traverse(3) // right
traverse(3) -> traverse(6) // left
traverse(6) -> nothing called
traverse(7) // right
traverse(7) -> nothing called