给你二叉树的根节点 root
,返回它节点值的 前序
遍历。
- 示例 1:
输入:root = [1,null,2,3]
输出:[1,2,3]
- 示例 2:
输入:root = []
输出:[]
- 示例 3:
输入:root = [1]
输出:[1]
💡解题关键:
- 我们需要知道
前序遍历
的遍历方式 - 本题就可以运用我们的秒杀技巧
❗特别注意:
- 本题中我们需要将
前序遍历
得到的结点存入数组
中,我们便需要提前得知此数组需要开辟多大的空间【即需要知道树的结点个数
】
👉秒杀分析:
- 计算树的结点个数时,整棵树(分为
根节点
、左子树
、右子树
)来看就是:
左子树
总的结点个数 + 右子树
总的结点个数 + 1
(根节点)
- 所以
逻辑关系
为:+
👆综上:
- 秒杀口诀为:
+
➕后序遍历
- 本质:利用递归的性质,先计算左子树总的结点个数,再计算右子树总的结点个数,最终返回的是
左子树
与右子树
总的结点个数的和 +1
(根节点自身个数)
✊动图示例:
👉代码实现:
int treeSize(struct TreeNode\* root)
{
return root == NULL ? 0 : treeSize(root->left) + treeSize(root->right) + 1;
}
void preorder(struct TreeNode\* root, int\*arr, int\* i)
{
//前序遍历
if (root == NULL)
{
return;
}
arr[(\*i)++] = root->val;
preorder(root->left, arr, i);
preorder(root->right, arr, i);
}
int\* preorderTraversal(struct TreeNode\* root, int\* returnSize)
{
\*returnSize = treeSize(root);
int\* arr = (int\*)malloc(sizeof(int)\*(\*returnSize));
int i = 0;
preorder(root, arr, &i);
return arr;
}
➡️补充:
- 我们需要带着自己开辟的
数组
和数组下标
进行前序遍历,因为需要将遍历得到的结点存入数组中 - 所以每一次
下标
的改变都需要让不同的递归栈帧
知道,所以下标
需要传的是地址
(否则如果传的是下标的临时拷贝,那数组内的结点之间就会造成覆盖)
🏷️ 另一棵树的子树【难度:简单】
🔍题目传送门: