力扣144. 二叉树的前序遍历

164 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第17天,点击查看活动详情

力扣144. 二叉树的前序遍历

一、题目描述:

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

示例 1:

img

输入:root = [1,null,2,3] 输出:[1,2,3] 示例 2:

输入:root = [] 输出:[] 示例 3:

输入:root = [1] 输出:[1] 示例 4:

img

输入:root = [1,2] 输出:[1,2] 示例 5:

img

输入:root = [1,null,2] 输出:[1,2]

提示:

树中节点数目在范围 [0, 100] 内 -100 <= Node.val <= 100

进阶:递归算法很简单,你可以通过迭代算法完成吗?

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/bi… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

  1. 这道题考察了什么思想?你的思路是什么?

    这道题目是考察对二叉树的先序遍历的掌握情况,我的思路是使用递归方法来遍历。

    题目的进阶要求:

    进阶:递归算法很简单,你可以通过迭代算法完成吗?

    对此进阶要求我不是很了解......

  2. 做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?

    不是一次通过的,刚开始想在一个函数中完成此题,发现如果要给returnSize赋初值,最好是另外开辟一个函数来完成遍历过程。

  3. 有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?

    我们来看一看大佬的迭代解法吧~

    image-20220419195745417

     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;
 }
 ​
 ​

image-20220419195000314

四、总结:

这道题目是我们必须掌握的。