
本篇博客会讲解力扣“144. 二叉树的前序遍历”的解题思路,这是题目链接。
先来审题:
 
 由于本篇博客会使用C语言来实现这道题,最简单的解法自然是使用递归。所谓前序遍历,即按照“根、左子树、右子树”的顺序来遍历,当遍历子树时,仍然按照“根、左子树、右子树”的顺序来遍历,以此类推,直到把这棵树遍历完。
由于题目要求返回一个数组,数组中存储了遍历的结果,所以我们需要使用一个下标来维护当前访问的位置。由于所有函数内部都应该是同一个遍历来表示下标,所以最好传该变量的地址。
数组需要开辟多大呢?这就需要求二叉树结点的个数了。方法很简单:仍然使用递归,总个数=左子树结点的个数+右子树结点的个数+1。
代码如下:
// 求二叉树结点的个数
int TreeSize(struct TreeNode* root)
{
    return root == NULL ? 0 : 
        TreeSize(root->left) + TreeSize(root->right) + 1;
}
void _preorderTraversal(struct TreeNode* root, int* a, int* pi)
{
    if (root == NULL)
    {
        return;
    }
    // 非空树:根,左树,右树
    a[(*pi)++] = root->val;
    _preorderTraversal(root->left, a, pi);
    _preorderTraversal(root->right, a, pi);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize){
    int size = TreeSize(root);
    int* ret = (int*)malloc(sizeof(int) * size);
    *returnSize = size;
    int i = 0; // 当前访问数组的下标
    _preorderTraversal(root, ret, &i);
    return ret;
}

 通过喽。
总结
前序遍历,即按照“根、左子树、右子树”的顺序来遍历,非常适合使用递归实现。
感谢大家的阅读!


















