Java 需要了解遍历二进制搜索树方法的帮助吗

Java 需要了解遍历二进制搜索树方法的帮助吗,java,recursion,binary-search-tree,Java,Recursion,Binary Search Tree,我遇到了一个遍历二叉搜索树的函数,但我无法理解它。代码如下: public void inOrderTraverseTree(Node focusNode){ if(focusNode != null){ inOrderTraverseTree(focusNode.leftChild); System.out.println(focusNode); inOrderTraverseTree(focusNode.rightChild);

我遇到了一个遍历二叉搜索树的函数,但我无法理解它。代码如下:

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
    循环将不会运行
  • 在这种情况下,难道这不意味着什么都不会被打印出来吗

但它应该是有效的()。有人能指出我哪里出错了吗?

这里应用的逻辑:

  • 检查聚焦节点。如果
    null
    ,则
    返回到父级的
    索引树
    。但是,由于在检查null之后什么也没有发生,因此附加的
    return
    语句与no语句完全相同

  • 如果不是
    null
    ,则对左侧子节点重复(1)中的步骤

  • 打印聚焦节点的值

  • 对右侧子节点重复(1)中的步骤

  • 从当前节点的inOrderTraverseTree
    返回到父节点的inOrderTraverseTree

  • 当然,如果焦点节点是
    根节点
    节点,
    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.
    

    这里应用的逻辑是:

  • 检查聚焦节点。如果
    null
    ,则
    返回到父级的
    索引树
    。但是,由于在检查null之后什么也没有发生,因此附加的
    return
    语句与no语句完全相同

  • 如果不是
    null
    ,则对左侧子节点重复(1)中的步骤

  • 打印聚焦节点的值

  • 对右侧子节点重复(1)中的步骤

  • 从当前节点的inOrderTraverseTree
    返回到父节点的inOrderTraverseTree

  • 当然,如果焦点节点是
    根节点
    节点,
    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.
    
    但是,由于root.leftChild没有
    leftChild
    -->
    focusNode.leftChild
    ==null
    ,if循环将不会运行

    不,会的。因为它是递归的,所以它将继续执行以前的调用,在本例中检查righchild节点

    观察函数的调用顺序:

    它继续

    但是,由于root.leftChild没有
    leftChild
    -->
    focusNode.leftChild
    ==null
    ,if循环将不会运行

    不,会的。因为它是递归的,所以它将继续执行以前的调用,在本例中检查righchild节点

    观察函数的调用顺序:


    继续…

    您需要了解这里的基本递归和二进制搜索树结构。让我们从下面的树中了解此算法:

    步骤:


    执行结束时

    您需要理解这里的基本递归和二叉搜索树结构。让我们从下面的树中了解此算法:

    步骤:


    执行完毕

    你说得对!没有“return”让我忘记了,语句在停止递归运行后将返回到调用点。你说得对!缺少“return”使我忘记了语句在停止进入递归运行后将返回到调用点。