繁体   English   中英

二叉树的预遍历。 如果vs而

[英]Preorder traversal of a binary tree. If vs while

我试图弄清楚为什么当我在下面的代码中代替if时,控制台输出卡在叶子的无限循环中。

void preOrder(Node root) {
    Node n = root;
    while(n != null) {
        visit(n);
        preOrder(n.left);
        preOrder(n.right);
        }
    }

当在叶子上调用preOrder的递归函数时,叶子上没有左子元素。

while(n != null)将始终为true或从不为true,因为循环的主体不会更改n的值。 因此,循环将永远不会执行,也不会无限循环。

由于您正在使用递归,因此不需要循环。

void preOrder(Node root) {
    Node n = root;
    if (n != null) {
        visit(n);
        preOrder(n.left);
        preOrder(n.right);
    }
}

当在叶子上调用preOrder的递归函数时,叶子上没有左子元素。

好吧, preOrder(n.left)的执行将终止(因为n.left为null),但是它将返回上一个preOrder调用,并调用preOrder(n.right) ,如果该调用终止,它将执行然后卡在无限的while循环中。

问题在于,当拥有while(n != null) ,您永远不会将n重新分配给可能不为null东西,从而导致无限循环。

您需要一个if语句,因为您已经有递归调用,它将遍历树直到找到叶子:

Node n = root;
if (n != null) {
    visit(n);
    preOrder(n.left);
    preOrder(n.right);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM