目录
题述(力扣难度:中等):
思路:
正确代码如下:
典型错误:
题述(力扣难度:中等):
给你二叉树的根节点 root,返回它节点值的 前序 遍历
示例1:
示例2:
输入:root = 【】
输出:【】
示例3:
输入:root = 【1】
输出:【1】
题中已给如下,让你完善preorderTraversal函数
struct TreeNode
{
int val;
struct TreeNode* left;
struct TreeNode* right;
};/*Note:The returned array must be malloced,assume caller calls free()*/
int* preorderTraversal(struct TreeNode* root, int* returnSize)
提示:
- 树中的节点数目在【0,100】内
- -100 <= node.val <= 100
思路:
本题不是简单的前序遍历,因其要求前序遍历的节点放在动态开辟的数组中
问题一:那数组开辟多大?需要一个求树节点个数的函数TreeSize,因在我的另一个博客二叉树的实现讲过思路,这里就不赘述了。然后前序遍历放入数组即可,这明显是个递归。
问题二:递归不能在preorderTraversal中递归,因为它其中有计算二叉树大小和动态开辟数组,而不用每次递归都算,故干脆写个子函数_preorderTraversal(前面加_一般表示某个函数的子函数的意思),然后在_preorderTraversal函数中每次递归把前序遍历的值从数组第i个下标开始放入数组中。
正确代码如下:
struct TreeNode
{
int val;
struct TreeNode* left;
struct TreeNode* right;
};
int TreeSize(struct TreeNode* root)
{
if (root == NULL)
{
return 0;
}
return 1 + TreeSize(root->left) + TreeSize(root->right);
}
void _preorderTraversal(struct TreeNode* root, int* array, int* pi)
{
if (root == NULL)
{
return;
}
array[(*pi)++] = root->val;
_preorderTraversal(root->left, array, pi);
_preorderTraversal(root->right, array, pi);
}
/*Note:The returned array must be malloced,assume caller calls free()*/
int* preorderTraversal(struct TreeNode* root, int* returnSize)
{
int size = TreeSize(root);
int* array = (int*)malloc(sizeof(int) * size);
int i = 0;//表示从数组中第i个下标开始放入数组中
_preorderTraversal(root, array, &i);
*returnSize = size;
return array;
}
典型错误:
i不用指针传地址调用可以吗?不行!
下面代码就是错误的,因没有用地址调用。
void _preorderTraversal(struct TreeNode* root, int* array, int i)
{
if (root == NULL)
{
return;
}
array[i] = root->val;
++i;
_preorderTraversal(root->left, array, i);
_preorderTraversal(root->right, array, i);
}
/*Note:The returned array must be malloced,assume caller calls free()*/
int* preorderTraversal(struct TreeNode* root, int* returnSize)
{
int size = TreeSize(root);
int* array = (int*)malloc(sizeof(int) * size);
int i = 0;//表示从数组中第i个下标开始放入数组中
_preorderTraversal(root, array, i);
*returnSize = size;
return array;
}