当前位置: 首页 > 知识库问答 >
问题:

二叉搜索树遍历法,是什么使它从左下的子(叶)向上?

张浩阔
2023-03-14

我很难理解SearchTree“按顺序遍历方法”在到达最左边的叶子后是如何向上的。我理解,一开始根变成leftchild,然后再往下一层leftchild,再往下一层,直到它变成最低的左叶,它没有左子,也没有右子。好的。但是在根是最后一片叶子之后,它怎么会变平。使traverse方法从左下的子级上升一级的确切代码行是什么。因为对于该节点,root.leftChild和root.rightChild都为空。这对我来说是魔法。

public void inOrderTraverseTree(节点根){

        if (root != null) {

            inOrderTraverseTree(root.leftChild);

            System.out.println(root);

            inOrderTraverseTree(root.rightChild);

        }

}

共有1个答案

西门磊
2023-03-14

这是因为递归函数的属性,它在执行后返回给父调用函数。例如
20
/\
10 30

这是一棵根为20的树。现在遍历您的inOrderTraverseTree代码:1。调用inOrderTraverseTree(20)2。检查根是否为null,这里20不是null。3.调用inOrderTraverseTree(10){20的左边是10}4。检查root是否为null,这里10不是null。5.调用inOrderTraverseTree(null){10的左侧为null}6。检查root是否为null,这里是null。因此退出“if”,返回到调用函数,即步骤4{root=10}7。打印根,即打印10。8.调用inOrderTraverseTree(null){10的右边为null}9。检查root是否为null,此处为null。因此退出“if”,返回调用函数,即步骤3{root=20}。{complete execution for root=10 is completed}10。打印root,即打印20。11.调用inOrderTraverseTree(30){20的右边是30}12.检查根是否为null,这里30不为null。13.调用inOrderTraverseTree(null){30的左侧为null}14。检查root是否为null,这里是null。因此退出“if”,返回到调用函数,即步骤12{root=30}15。打印根,即打印30。16.调用inOrderTraverseTree(null){30的右边为null}17。检查root是否为null,此处为null。因此退出“if”,返回调用函数,即步骤11{root=20}。{root=30完成完全执行}

这样,根为20的inOrderTraverseTree调用的完全执行也就完成了,打印的值是10(在步骤7中)、20(在步骤10中)、30(在步骤15中):10 20 30。现在来看“使遍历方法从左下的子级上升一级的代码”:您可以在第9步中看到这一点。其中,当最左侧子级的完整函数循环完全执行时,最左侧子级返回给其父级调用函数。这是递归函数的主要性质。

 类似资料:
  • 编写一个函数,如果给定的二叉搜索树包含给定的值,则返回1,否则返回0。 例如,对于以下树: N1(值:1,左:null,右:null) n2(值:2,左:n1,右:n3) N3(值:3,左:null,右:null) 对contains(&n2,3)的调用应返回1,因为根位于n2的树包含编号3。 函数应该返回1,然而,它返回0或者根本不返回。

  • 对于二叉搜索树:7为根,1为左子,10为右子。 我试过调试这个函数,看看它是如何工作的,但我似乎不能理解一件事。函数检查并看到1的左子项和右子项都为空后,它就移动到节点10,然后检查右子项是否为空。有人能解释一下递归模式,以及为什么方法在初始检查节点1后没有退出。

  • 通常我们按顺序、前顺序或后顺序遍历二叉搜索树。但是,当我们按照从右到根到左的递归顺序遍历二叉搜索树时,会发生什么呢? 假设如果我将值存储在数组中,并且与前序遍历相比,当我们按此顺序遍历时,它的时间复杂度是否会增加。

  • 这是一个相当简单的问题,我注意到当我表示一棵树时,无论我用哪种方式(后排序,按顺序,前排序)树叶总是以相同的顺序出现,从左到右。 我只是想知道为什么,这是有原因的吗? 我刚开始研究它们,就想到了这个。 编辑: 我有一棵这样的树: 叶节点为:D、E和F 预购顺序为:A、B、D、C、E、F 顺序是:D,B,A,E,C,F 后序是:D,B,E,F,C,A 叶子节点总是从左到右出现,不管我选择哪个顺序,问

  • 如果我们要在左子树中找到节点,甚至在根节点上,它会给出正确的输出,但是如果我们在右边找到任何节点,比如根->right,即节点70,它会给出错误的输出20、30、40、50、60。我知道我在哪里犯了错误,我应该如何修改代码,这样对于输入70,只有它的左子树,即,节点60是打印的。

  • //执行顺序遍历的递归方法