一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第17天,点击查看活动详情。
力扣144. 二叉树的前序遍历
一、题目描述:
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
示例 1:
输入:root = [1,null,2,3] 输出:[1,2,3] 示例 2:
输入:root = [] 输出:[] 示例 3:
输入:root = [1] 输出:[1] 示例 4:
输入:root = [1,2] 输出:[1,2] 示例 5:
输入:root = [1,null,2] 输出:[1,2]
提示:
树中节点数目在范围 [0, 100] 内 -100 <= Node.val <= 100
进阶:递归算法很简单,你可以通过迭代算法完成吗?
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/bi… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
-
这道题考察了什么思想?你的思路是什么?
这道题目是考察对二叉树的先序遍历的掌握情况,我的思路是使用递归方法来遍历。
题目的进阶要求:
进阶:递归算法很简单,你可以通过迭代算法完成吗?
对此进阶要求我不是很了解......
-
做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?
不是一次通过的,刚开始想在一个函数中完成此题,发现如果要给returnSize赋初值,最好是另外开辟一个函数来完成遍历过程。
-
有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?
我们来看一看大佬的迭代解法吧~
int* preorderTraversal(struct TreeNode* root, int* returnSize) { int* res = malloc(sizeof(int) * 2000); *returnSize = 0; if (root == NULL) { return res; } struct TreeNode* stk[2000]; struct TreeNode* node = root; int stk_top = 0; while (stk_top > 0 || node != NULL) { while (node != NULL) { res[(*returnSize)++] = node->val; stk[stk_top++] = node; node = node->left; } node = stk[--stk_top]; node = node->right; } return res; } 作者:LeetCode-Solution 链接:https://leetcode-cn.com/problems/binary-tree-preorder-traversal/solution/er-cha-shu-de-qian-xu-bian-li-by-leetcode-solution/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
三、AC 代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
void Traversal(struct TreeNode* root,int *arr, int* arrSize){
if(root == NULL ){
return;
}
arr[(*arrSize)++] = root->val;
Traversal(root->left,arr,arrSize);
Traversal(root->right,arr,arrSize);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize){
int* arr = (int *)malloc(sizeof(int)*101);
*returnSize = 0;
Traversal(root,arr,returnSize);
return arr;
}
四、总结:
这道题目是我们必须掌握的。