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

在C语言中返回整数数组的前序树遍历函数

苍意智
2023-03-14

我尝试编写一个函数,它返回一个整数数组,其中包含按前序排列的二叉树的节点值,即节点值必须出现在其左右子节点的值之前。

>

  • 如果root为NULL,则返回NULL

    对于每个节点,左孩子在右孩子之前

    例如

    int *a = preorder(bt1);
    for (i=0; i<3; i++)
        printf("%d ", a[i]);
    >2_1_3_
    

    这是我的工作,但它不起作用,我的代码中哪里有问题?

    int* preorder(TreeNode *root) {
        int *a = malloc(sizeof(int)*50);
        int i=0;
    
        if(root == NULL)
            return NULL;
        else {
            if(root != NULL) {
                a[i] = root->val;
                i++;
                preorder(root->left);
                preorder(root->right);
                return a;
            }
        }
    }
    
  • 共有3个答案

    程成天
    2023-03-14

    使用preorder()的所需函数签名,解决方案是不可能的。因此,您需要一个用于root==NULL情况的帮助函数和一个遍历函数,该函数指向数组中的当前位置。它还返回一个指向数组中下一个空闲槽的指针。解决方案可能如下所示:

    #include <stdio.h>
    #include <malloc.h>
    
    struct TreeNode {
        int val;
        struct TreeNode* left, * right;
    };
    
    int tree_size(/*struct TreeNode* tree*/) { return 7; }
    
    int* preorder_(struct TreeNode* tn, int* v) {
        *v++ = tn->val;
        if (tn->left) v = preorder_(tn->left, v);
        if (tn->right) v = preorder_(tn->right, v);
    
        return v;
    }
    
    int* preorder(struct TreeNode* tn) {
        if (tn) {
            int* v = malloc(tree_size(/*tn*/) * sizeof(int));
            preorder_(tn, v);
            return v;
        } else {
            return NULL;
        }
    }
    
    int main(void) {
        //    4
        //  2   5
        // 1 3 6 7
        struct TreeNode
            left = {2, &{1}, &{3]}, 
            right = {5, &{6}, &{7}}, 
            root = {4, &left, &right};
        int *v, i;
    
        v = preorder(&root);
        for (i = 0; i < tree_size(/*tn*/); i++) {
            printf("%d ", v[i]); // 4 2 1 3 5 6 7
        }
        free(v);
    
        return 0;
    }
    

    现场演示

    贺玉石
    2023-03-14

    在该函数的每次递归调用中,您将分配:

    int*a=malloc(sizeof(int)*50);

    您需要为数组分配一次空间,然后使用同一个数组。使用i=0也是一样的。你需要使用一个计数器。

    您可能希望在main函数中创建数组,然后将数组作为函数参数传递。或者您可以使用全局数组,并以这种方式访问它。计数器变量也是如此。

    注意:我在你们的例子中看不到内存分配的意义。如果您确定树的节点数不会超过数组大小,那么最好使用静态数组。

    上官锦
    2023-03-14

    代码中有两个问题:

    1. 您必须为结果分配一次数组。调用预订单之前

    一个示例是以下代码:

    int *a = malloc(sizeof(int)*50);
    int inx = 0;
    preorder(bt1, a, &inx);
    
    
    
    void preorder(TreeNode *root, int* a, int* inx) {
        if(root == NULL)
            return;
        else {
            if(root != NULL) {
                a[*inx] = root->val;
                *inx = *inx + 1;
                preorder(root->left, a, inx);
                preorder(root->right, a, inx);
            }
        }
    }
    
     类似资料:
    • 函数的返回值是指函数被调用之后,执行函数体中的代码所得到的结果,这个结果通过 return 语句返回。 return 语句的一般形式为: 或者: 有没有 都是正确的,为了简明,一般也不写 。例如: 对C语言返回值的说明: 1) 没有返回值的函数为空类型,用 表示。例如: 一旦函数的返回值类型被定义为 void,就不能再接收它的值了。例如,下面的语句是错误的: 为了使程序有良好的可读性并减少出错,

    • 在我的C程序中,我使用了一个带有以下参数的void函数:一个2D int数组、一个用于创建新动态数组的int指针和一个最后的int指针,该指针将保存函数内部发生的计数。因此,动态数组是使用malloc在函数中创建的,一切正常,直到调用函数后在main()中打印其元素。我得到的是垃圾,而不是我应该看到的数字。以下是功能代码:

    • C++ 数组 C++ 不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。 如果您想要从函数返回一个一维数组,您必须声明一个返回指针的函数,如下:int * myFunction() { . . . } 另外,C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。 现在,让我们来看下面的函数,它会生成 10 个随机数,并

    • C语言允许函数的返回值是一个 指针(地址),我们将这样的函数称为 指针函数。下面的例子定义了一个函数 strlong(),用来返回两个字符串中较长的一个: 运行结果: C Language↙ c.biancheng.net↙ Longer string: c.biancheng.net 用指针作为函数返回值时需要注意的一点是,函数运行结束后会销毁在它内部定义的所有局部数据,包括局部变量、局部数组和

    • 我想用C++做一个简单的函数来练习一下。它应该做与python中的range()函数相同的事情,但现在要简单得多。我遇到了一个问题,数组没有正确地从函数返回到主函数。我曾经在下面编码,得到了一个奇怪的错误。有人知道问题出在哪里吗?

    • 本文向大家介绍C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法,包括了C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的C#程序设计有所帮助。