【数据结构】C语言算法练习题——前序遍历

这篇博客主要讲解如何使用动态内存分配和递归解决LeetCode上的二叉树前序遍历问题。通过自定义函数计算二叉树节点数量,然后动态创建数组存储遍历结果,避免了多次malloc。在递归函数中,利用指针传递数组下标,确保遍历过程中的状态共享。最后,提供了完整的C语言代码实现。
摘要由CSDN通过智能技术生成

题目链接:

力扣icon-default.png?t=M4ADhttps://leetcode.cn/problems/binary-tree-preorder-traversal/

解题思路:

1. 首先自定义一个可以求所给二叉树结点的函数

2. 然后需要动态开辟数组(这个数组便是题目要求输出的最终结果),因为静态数组出了作用域便会被销毁,而动态内层分配除了 free 之外,它都不会被销毁

3. 不能对题目中所给的函数进行递归,因为我们在这个函数里面有 malloc ,如果对其函数进行递归,则每一次的调用都要进行 malloc ,从而浪费了空间

解决的办法是:

再次自定义一个函数

4. 没有 void*,只有 void 

代码实现:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */


/**
 * Note: The returned array must be malloced, assume caller calls free().
 */

int TreeSize (struct TreeNode *root)//该函数用来求题目中所给二叉树的结点个数
{
    return root == NULL? 0 : TreeSize(root->left)+TreeSize(root->right)+1;//+1的原因是要算上根结点
}

void PrevOrder(struct TreeNode *root,int *a,int *i)//用来递归的前序遍历函数,其中的 i 是遍历过程中数组的下标
/*这里不用 i 而是使用 &i 的原因是:
该函数需要被递归调用,而在每一次的调用过程中,我们只希望使用一个 i 的值
而如果不使用&i ,会导致每一次函数调用产生的函数栈帧都会产生一个 i ,而彼此之间的函数栈帧不会相互影响*/
{
    if(root == NULL)
    {
        return;
    }

    //当二叉树不为空树时:
   a[(*i)++] = root->val;//要把结点的值按前序遍历的顺序放入动态数组 a 中
    PrevOrder(root->left,a,i);//注意这里不是 &i,因为 i 此时已经是地址了
    PrevOrder(root->right,a,i);//前序遍历的顺序

}
int* preorderTraversal(struct TreeNode* root, int* returnSize)//这里的returnSize的类型是int*的原因是:形参的改变无法影响实参
{
    *returnSize = TreeSize(root);
    int *a = (int *)malloc(*returnSize *sizeof(int));
    int i = 0;
    PrevOrder(root,a,&i);//注意这里是 &i

    return a;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值