如何计算Java中的递归调用数?

时间:2017-05-15 10:54:04

标签: java recursion

我使用下面给出的方法来计算二叉树的高度,

int height(Node root)
{
    if (root == null)
       return 0;
    else
    {
        int lheight = height(root.left);
        int rheight = height(root.right);

        if (lheight > rheight)
            return(lheight+1);
        else return(rheight+1); 
    }
}

这返回lheight = 2.最初我认为每次递归调用height(root.left)时lheight会增加1。但后来我添加了一个printf语句并再次运行,

int height(Node root)
{
    if (root == null)
       return 0;
    else
    {
        int lheight = height(root.left);
        System.out.print(lheight);
        int rheight = height(root.right);

        if (lheight > rheight)
            return(lheight+1);
        else return(rheight+1); 
    }
}

printf语句打印此0 1 0 2 0.每次递归调用时lheight的值如何变化?我不是在寻找新的解决方案。我知道这可以通过多种方式完成。我只是想了解这段代码中发生了什么。这是二叉树图像链接。 Binary tree

5 个答案:

答案 0 :(得分:1)

将count作为参数传入方法,最初设置为0或1(取决于您的偏好),然后在每次递归调用方法时增加它。

编辑:说实话,我没有测试过这段代码,所以我无法弄清楚你应该如何改变高度值。像这样的感觉将是无限递归。

无论如何,这是跟踪递归计数的基本思路:

int height(Node root, int lCount, int rCount)
{
    if (root == null){
       return 0;
    }
    else {
        int lheight = height(root.left, lCount + 1, rCount);
        int rheight = height(root.right, lCount, rCount + 1);

        if (lheight > rheight){
            return(lheight);
        }
        else return(rheight); 
    }
}

使用 height(root,0,0)初始化方法调用,执行的L和R“分支”的最后一次执行将分别生成总计。

答案 1 :(得分:1)

做这样的事情 -

int height(Node root)
{
    if (root == null)
       return 0;
    else
    {
        return 1+ Math.max(height(root.left),height(root.right));
    }
}

像这样计算身高调用

int height = height(root); //this is the height not inside the function

我还没有编译它 - 但这是获得树高的方法(c / c ++ / java /..)

答案 2 :(得分:0)

树的高度是左子树高度和右子树高度的最大值。所以,如果你看到你的代码,那么它递归地计算左右子树的高度并检查哪个是最大值。如果你真的想要想象它。制作被调用方法的树结构。您可以轻松地将其可视化。

答案 3 :(得分:0)

以此为例

        1

      /   \
    2      3
  /  \
4     5

首先,1将通过其左侧[height(root.left)],因此将调用2。然后2将通过其左侧,因此将调用4。现在将调用它4。

因为4没有任何剩余它会传递null或0传递给 lheight 。所以这次代码转到下一步,即函数[height(root.right)]。

对于4的右边,我们有null,所以0将返回到rheight。现在借助 [返回(rheight + 1); ]函数,值1将被传递给调用函数2。

所以2将有lheight为1.Now 2现在将调用它的right.And循环继续,2将有两个值l = 1和r = 1并将返回1 + 1 = 2到它的调用函数即1。

调用1的权限,它将返回1,具有与之前相同的循环。最后,我们有l = 2和r = 1。因此,我们的最终值将是[lheight + 1] = 3。所以树的高度是3

答案 4 :(得分:-1)

你可以创建一个全局变量,每次该函数调用自己时都会增加该变量

int i;   //it has to be initialized with 0 


int height(Node root)
{
    if (root == null)
        return 0;
    else
    {
         i++;
         int lheight = height(root.left);
         printf("%d ", lheight);
         i++;
         int rheight = height(root.right);

         if (lheight > rheight)
             return(lheight);
         else return(rheight); 
     }
 }