递归函数的返回值

时间:2015-07-16 05:57:14

标签: recursion

在下面的代码中,我试图更好地理解递归实际上是如何工作的。我一直对它的实际工作感到有点困惑。我想知道inorder()函数在每一步中实际返回的值。从哪里得到这些值分别为0,0,11,0,0,11,12,0,0,11。有人能告诉我逻辑吗?它是一个基本的顺序树遍历程序。我试图理解这些输出的原因是因为相同的逻辑以某种方式用于查找树的深度(我认为)其中每次递归的值都是深度增加而没有初始化。

#include<stdio.h>
#include<stdlib.h>

struct node
{
    int data;
    struct node *left;
    struct node *right;
};

struct node* newNode(int data)
{
    struct node* node=(struct node*)malloc(sizeof(struct node));
    node->data=data;
    node->left=NULL;
    node->right=NULL;
    return node;
}

int inorder(struct node *temp) {
   if (temp != NULL) {
    printf("\nleft  %d\n",inorder(temp->left));
    printf("\n%d\n", temp->data);
    printf("\nright   %d\n",inorder(temp->right));
   }
}

int main()
{
    struct node *root=newNode(1);

    root->left=newNode(2);

    root->right=newNode(3);

    root->left->left=newNode(4);

    root->left->right=newNode(5);


    inorder(root);
    getchar();
    return 0;
}

1 个答案:

答案 0 :(得分:1)

此功能应更改为以下内容(原始代码中的第一个和最后一个打印只会让您更加困惑!):

int inorder(struct node *temp) {
   if (temp != NULL) {
    inorder(temp->left);
    printf("%d\n", temp->data);
    inorder(temp->right);
   }
}

递归从特定节点的左分支(通常是“根”)开始 - 递归(按顺序)打印该左分支上的所有节点,然后打印当前节点,继续递归打印(按顺序)右分支中的所有节点。

顺便说一句,如果你想保持那棵树“有序”(意思是,左分支上的所有节点都小于节点,而右分支上的所有节点都大于或等于节点)你应该改变:

root->left->left=newNode(4);
root->left->right=newNode(5);

为:

root->right->right=newNode(4);
root->right->right->right=newNode(5);