题目
二叉树的前序遍历
题目要求
示例
解答
方法一、
递归法
实现思路
使用递归依次将该结点的数据,该结点的左子树的数据,该结点的右子树的数据都存入数组中,其中函数中i为一个地址,通过解引用这个地址就可以得到i的值,即数组中该第几个下标存值。
时间复杂度和空间复杂度
时间复杂度:O(N)
空间复杂度:O(N)
代码
void PreOrder(struct TreeNode* root,int* arr,int* i)
{
if(root==NULL)
{
return ;
}
//因为是先序遍历,所以先遍历该结点的值
arr[*i]=root->val;
//将i的值+1
//因为传进来的i为地址,所以通过*i改变的是i地址里面的值,即改变的是主函数中的i的值
(*i)++;
//然后再遍历该结点左子树
PreOrder(root->left,arr,i);
//最后遍历该结点右子树
PreOrder(root->right,arr,i);
}
//求出二叉树的结点个数
int TreeSize(struct TreeNode* root)
{
if(root==NULL)
{
return 0;
}
return TreeSize(root->left)+TreeSize(root->right)+1;
}
int* preorderTraversal(struct TreeNode* root, int* returnSize){
//将数组长度返回
*returnSize=TreeSize(root);
int i = 0;
//申请数组空间
int* arr = (int*)malloc(sizeof(int)*(*returnSize));
//将i的地址传入,这样在函数中可以通过*i修改i的值。
PreOrder(root,arr,&i);
return arr;
}
方法二、
实现思路
时间复杂度和空间复杂度
代码