题目:如下
给你二叉树的根节点 root,返回它节点值的前序遍历。
答案:如下图
/**
* 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().
*/
TreeSize(struct TreeNode* root)
{
if (root == NULL)
{
return 0;
}
return 1 + TreeSize(root->left) + TreeSize(root->right);
}
//主函数存在returnSize无法被调用,故我们采取构建子函数进行递归调用
void _preorderTraversal(struct TreeNode* root, int* array, int* pi)
{
if (root == NULL)
{
return;
}
//将数存入数组中去,*pi是进行简引用,pi是地址
array[(*pi)++] = root->val;
_preorderTraversal(root->left, array, pi);
_preorderTraversal(root->right, array, pi);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize) {
//开辟空间需要知道数组大小故我们先求数组大小
int size = TreeSize(root);
*returnSize = size;
//开辟数组并且构建调用函数
int* array = (int*)malloc(sizeof(int) * size);
int i = 0;
_preorderTraversal(root, array, &i);
return array;
}
解析:
(1)开辟空间求数组个数
TreeSize(struct TreeNode* root)
{
如果根节点为空那么数组个数就为空,返回数组个数0,
if (root == NULL)
{
return 0;
}
不为空时我们就采用递归的思想进行求解,1为根节点,具体图解如下,结点总数为3
return 1 + TreeSize(root->left) + TreeSize(root->right);
}
(2)定义size接收个数,简引用*returnSize
int size = TreeSize(root);
*returnSize = size;
(3)开辟数组并且构建调用函数
int* array = (int*)malloc(sizeof(int) * size);
(4)构建子函数进行递归调用
int* preorderTraversal(struct TreeNode* root, int* returnSize)
主函数存在returnSize无法被调用,故我们采取构建子函数进行递归调用
传入根结点,数组指针,以及变量pi
void _preorderTraversal(struct TreeNode* root, int* array, int* pi)
{
if (root == NULL)
{
return;
}
将数存入数组中去,*pi是进行简引用(*pi)++是简引用将变量pi加一,pi是地址,调用自身左树以及右树,将数依次存入数组中去
array[(*pi)++] = root->val;
_preorderTraversal(root->left, array, pi);
_preorderTraversal(root->right, array, pi);
}
(5)定义变量i,传入相关变量
这里要确保只有一个变量i,故我们传入i的地址,避免i在传入后进行调用
假若不传入i的地址开始进入左树根节点中时i=3,随着左树存储值到array数组中此时叶子结点i=10开始返回变量i,但是当向上返回到左树根节点时由于函数内定义了i=3,所以i仍然为3,没办法将i=10传入右树进行存储值
int i = 0;
_preorderTraversal(root, array, &i);
(6)返回array数组
return array;
到这里我们解题完毕
如果对您有帮助的话点一个免费的赞和收藏叭!
由于作者水平不足,如果有任何错误,麻烦读者评论在评论区指点一下,谢谢!