通过将二叉树保存的数组存储在数组中的方式遍历二叉树,顺序为前序,
前序:根 左子树 右子树
同时,左子树也是根,也有左右子树,右子树也是如此,故可以分为存储根,子问题为存储左子树,存储右子树
int* preorderTraversal(struct TreeNode* root, int* returnSize)
{
}
//返回类型是数组,是存储了二叉树的数组,用returnSize来辅助存储二叉树到数组中
//存储操作在另一个递归函数中完成
递归函数如下
void preorder(struct TreeNode*root,int*arr,int*returnSize)
{
if(root==NULL)
{
return ;
}
arr[(*returnSize)++]=root->val;//根节点先进入数组
preorder(root->left,arr,returnSize);//左子树再进入,但进入函数后,先完成本节点的存储,在进入它自己的左子树
preorder(root->right,arr,returnSize);//右子树最后进入,进入后,先完成本节点的存储,在进入它自己的左子树
}
1.returnSize作为下标传过去,因为是递归函数,充当数组的下标,故需要变化,所以是地址传递。
2.arr数组用来保存二叉树每个节点的值
3.先保存本节点,在用函数去处理左子树与右子树,进入函数后,左右子树也是相同的操作,都是先将自己当根节点处理,在去处理左右子树,这样就达到了根 左子树 右子树的效果,遇到空节点直接返回上一层函数
void preorder(struct TreeNode*root,int*arr,int*returnSize)
{
if(root==NULL)
{
return ;
}
arr[(*returnSize)++]=root->val;
preorder(root->left,arr,returnSize);
preorder(root->right,arr,returnSize);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize)
{
int*arr=(int*)malloc(sizeof(int)*100);
*returnSize=0;
preorder(root,arr,returnSize);
return arr;
}
c++版本
class Solution {
public:
void preorder(vector<int>&pa,TreeNode*root)
{
if(root==NULL)
{
return ;
}
pa.push_back(root->val);
preorder(pa,root->left);
preorder(pa,root->right);
}
vector<int> preorderTraversal(TreeNode* root)
{
vector<int>pa;
preorder(pa,root);
return pa;
}
};