我对下面的代码有点困惑,以找到树的高度和递归查找sum of n nos
的代码,低于此值。 lheight
和rheight
存储什么,具体取决于它的递归次数?
int height(struct node* node)
{
if (node==NULL)
return 0;
else
{
lheight = height(node->left);
rheight = height(node->right);
if (lheight > rheight)
return(lheight+1);
else return(rheight+1);
}
}
这是另外一个澄清,它打印n nos
:
int findSum(int n){
int sum;
if(n <= 0) return 0;
else sum = n + findSum(n-1);
return sum;
}
如果我将其更改为:
int findSum(int n){
int sum;
if(n <= 0) return 0;
else sum = findSum(n-1); // here
return sum;
}
它将输出打印为0.如果上面的树代码没有,为什么不返回递归次数?
答案 0 :(得分:3)
您的第二次递归相当于
sum = findSum(n-1) = findSum(n-2) = findSum(n-3) = ..... = findSum(0) = 0;
如果您希望第二次递归返回递归次数,请使用
sum = 1 + findSum(n-1);
lheight
和rheight
返回树级别,因为在递归函数中,两个变量都有1
递增:
return(lheight+1);
else return(rheight+1);
如果您希望findsum()
执行与height()
同步相同的操作,则应在sum+1
功能结束时返回sum
而不是findsum()
:
int findSum(int n){
int sum;
if(n <= 0) return 0;
else sum = findSum(n-1);
return sum+1; //<<<<< should return sum +1 as you did in the height function
}
只有在
时才会评估return sum+1;
findSum(n-1)
; findSum(n-2)
; findSum(n-3)
; ... findSum(0)
;被称为。
findSum(0)
时,会返回0
; findSum(1)
时,会执行sum=findSum(0)
(所以sum
= 0
),然后返回sum+1
(1
); findSum(2)
时,会执行sum=findSum(1)
(所以sum
= 1
),然后返回sum+1
(2
); findSum(3)
时,会执行sum=findSum(2)
(所以sum
= 2
),然后返回sum+1
(3
); findSum(n)
时,它将执行sum=findSum(n-1)
(所以
sum = n-1
)然后返回sum+1
(n
); 答案 1 :(得分:1)
我建议你在纸上这样做。如果我们为(未修改的)findSum
函数执行此操作,它将是这样的:
不要说你称之为
findSum(2);
这将阅读以下步骤:
1: sum = 2 + findSum(2 - 1);
将调用导致
的findSum(1)
2: sum = 1 + findSum(1 - 1);
调用findSum(0)
3: return 0;
现在我们向后退一步到2
:
2: sum = 1 + 0;
再次备份:
1: sum = 2 + 1
所以findSum(2)
的结果是3。
答案 2 :(得分:1)
lheight和rheight只不过是在树的特定级别上左子树和右子树的高度。
如果你举一个例子,这可以更容易理解。
在附图中,我们从根F开始。我们检查root是否为null,并且由于它不是,我们找到右子树和左子树的高度,以及更多,我们添加还有一个并返回。这就是我们手动完成的方法。
现在在找到左子树的高度时,我们递归地向下,直到我们到达空指针,此时我们返回0.因此A的值返回为0,然后我们检查右子的高度树(即D),为此我们递归地向下直到C,返回0,同样0返回0.我们在C和E的最大值(即0)中加1,并将其返回到上一级。现在我们的A值为0,D值为1,我们将最大值加1(即1)并将其返回到上一级。这是完整树的左子树的高度,类似地计算右子树的高度。