Leetcode.144. 二叉树的前序遍历

1.题目描述

给你二叉树的根节点 root ,返回它节点值的前序遍历
示例一:

在这里插入图片描述
示例二:
在这里插入图片描述
示例三:
在这里插入图片描述
示例四:
在这里插入图片描述
示例五:
在这里插入图片描述

2.原题链接

Leetcode.144. 二叉树的前序遍历

3.思路分析

Leetcode 只要是返回数组 ,也要返回数组的大小,C语言做不到同时返回两个值 , 有什么解决办法? 返回数组的大小通过参数返回

int  TreeSize(struct TreeNode* root)
{
    
    
    return root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;
}
void   preorder(struct TreeNode* root, int* a, int i) // 根 左子树 右子树 
{
    
    
    if (root == NULL)
        return;
   
    a[i++] = root->val;
    preorder(root->left,a, i);
    preorder(root->right,a, i);


}

int* preorderTraversal(struct TreeNode* root, int* returnSize)
{
    
    
    *returnSize = TreeSize(root); // 返回数组大小
    int* a = (int*)malloc(sizeof(int) * (*returnSize));
    
    //前序遍历 
    int i = 0;
    preorder(root, a, i);

    return a;

}

注意细节 : 上述代码的 i 问题 如果用下图中的示例就不能通过 :
上一层 的 i 和下一层的 i 不是同一个i 虽然是同一个名字 ,对下一层的 i 进行++ ,不会影响上一层 ,因为每个函数栈帧都有一个 i , 也就是说上一层的 i 在一个函数栈帧 ,下一层的 i 的在另一个函数栈帧里

在这里插入图片描述
如果需要解决这个问题 ,我们需要将 i 变成同一个i ,只需要传i 的地址 , 访问(*pi)就是访问 pi的内容

4.代码实现

int  TreeSize(struct TreeNode* root)
{
    
    
    return root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;
}
void   preorder(struct TreeNode* root, int* a, int * pi) // 根 左子树 右子树 
{
    
    
    if (root == NULL)
        return;
   
    a[(*pi)++] = root->val;
    preorder(root->left,a, pi);
    preorder(root->right,a, pi);


}

int* preorderTraversal(struct TreeNode* root, int* returnSize)
{
    
    
    *returnSize = TreeSize(root); // 返回数组大小
    int* a = (int*)malloc(sizeof(int) * (*returnSize));
    
    //前序遍历 
    int i = 0;
    preorder(root, a, &i);

    return a;

}

在这里插入图片描述
如果你觉得这篇文章对你有帮助,不妨动动手指给点赞收藏加转发,给鄃鳕一个大大的关注
你们的每一次支持都将转化为我前进的动力!!

猜你喜欢

转载自blog.csdn.net/qq_73478334/article/details/129907699