1.题目描述
给你二叉树的根节点 root ,返回它节点值的前序遍历
示例一:
示例二:
示例三:
示例四:
示例五:
2.原题链接
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;
}
如果你觉得这篇文章对你有帮助,不妨动动手指给点赞收藏加转发,给鄃鳕一个大大的关注
你们的每一次支持都将转化为我前进的动力!!