leetcode144. 二叉树的前序遍历 递归+迭代ts

54 阅读1分钟

144. 二叉树前序遍历 - 力扣(LeetCode)

前言:实现之前忘记了 前中后遍历怎么输入,于是找到了一篇文章颇为生动的遍历博客学习 blog.51cto.com/yang/289993… 供共同学习之

解法1: 递归

function preorderTraversal(root: TreeNode | null): number[] {
  let res:Array<number> = []
  const _preorderTraversal = (_root)=>{
    if(_root==null){
      return 
    }
    res.push(_root.val)
    _preorderTraversal(_root.left)
    _preorderTraversal(_root.right)
  }
  _preorderTraversal(root)
  return res 
};

Q:这里我觉得一个有意思的点是可以把res作为参数传到函数里面,最终返回来,但是我会有一个小疑问,每次调用的时候 调用栈里面就会多存一个入参,这样会增加内存,然后导致执行时间增加,这么想有问题吗。于是有把res作为一个全局的变量,然后进行操作,最终作为返回值

方法2:迭代+栈实现 1.要定义一个栈 2.把根元素压入栈 3.迭代,当栈中有元素的时候,就出栈,然后把它的左右节点压入栈。需要注意的是栈是先入后出,所以先压入右节点,再压入左节点

function preorderTraversal(root: TreeNode | null): number[] {
  let arr:Array<TreeNode>=[],res:Array<number>=[];
  if(root!=null){
    arr.push(root) //跟节点入栈
  }
  while(arr.length>0){ //只要栈不空
    let curNode = arr.pop()//第一次往出拿
    res.push(curNode.val)
    //当前节点的左右节点入栈, 因为栈是先入后出,所以先入右节点
    if(curNode.right!=null){ 
      arr.push(curNode.right)
    }
    if(curNode.left!=null){
      arr.push(curNode.left)
    }
  }
  return res 
};

Q:关于使用栈处理,我又有了一个问题, 为什么要引入这种方式来处理呢,递归迭代多香,只需要使用三行核心就可以实现,而且不需要使用栈在脑中模拟输出。