我遇到了一个遍历的二叉搜索树函数,但无法解决。这是代码:

public void inOrderTraverseTree(Node focusNode){
    if(focusNode != null){
        inOrderTraverseTree(focusNode.leftChild);
        System.out.println(focusNode);
        inOrderTraverseTree(focusNode.rightChild);
    }
}


假设有一个“两级”平衡二进制搜索树,这就是我对这种递归方法的理解:


root != null-> inOrderTraverseTree(root.leftChild)方法开始运行
root.leftChild != null-> inOrderTraverseTree(root.leftChild.leftChild)方法正在运行
但是,由于root.leftChild没有leftChild-> focusNode.leftChild == null,因此if循环将不会运行
在这种情况下,这是否不意味着什么都不会打印?


但是据称它可以工作(https://www.youtube.com/watch?v=M6lYob8STMI)。谁能指出我哪里出问题了?

最佳答案

这里应用的逻辑:


检查焦点节点。如果为null,则return为父级的inOrderTraverseTree。但是,由于在检查null之后没有任何反应,因此附加的return语句与根本没有语句相同。
如果不是null,则从(1)重复左子节点。
打印焦点节点的值。
从(1)重复右边的子节点。
从当前节点的inOrderTraverseTree返回到父节点的inOrderTraverseTree


当然,如果焦点所在的节点是root节点,则inOrderTraverseTree会简单地返回到main或首先调用它的方法。

例如,考虑下面的树:

            A
          /   \
         B     C
        / \   / \
       D   E F   G


跟踪:

A->inOrderTraverseTree(left)
    B->inOrderTraverseTree(left)
        D->inOrderTraverseTree(left) //null, return to D
        print(D)
        D->inOrderTraverseTree(right) //null, return to D
        return to B

    print(B)

    B->inOrderTraverseTree(right)
        E->inOrderTraverseTree(left) //null, return to E
        print(E)
        E->inOrderTraverseTree(right) //null, return to E
        return to B

    return to A

print(A)

A->inOrderTraverseTree(right)
    //Continue for the right subtree.

07-26 08:52