用JavaScript刷leetcode第144题-二叉树的前序遍历

515 阅读1分钟

前言

将用 递归迭代 来解这道题,这两种本质都是用,递归隐式的用了栈,而迭代将显示用栈。

一、题目描述

leetcode地址
git代码
给你二叉树的根节点 root ,返回它节点值的 前序遍历
前序遍历的顺序是根节点、左子树、右子树,其属于深度遍历的一种。

二、解题

2.1 迭代法

2.1.1 思路

  • 迭代 + 栈
  • 迭代继续条件:栈不为空
  • 栈是后进先出,故要先压右子树,再压左子树

2.1.2 图解

自己画的图,大家将就看,配合下面的解释以及代码看,很容易理解的。
根节点压栈,接着出栈,出栈的同时,把当前节点的值添加到输出结果中,并让当前节点的右子树、左子树依次压栈。

二叉树.jpg

2.1.3 代码

const preorderTraversal = function (root) {
  // 如果根节点为空,就不用遍历了
  if(root === null) return []
  // res用来储存遍历结果
  const res = []
  
  // 模拟栈
  const stack = [root]
  
  // 迭代继续的条件stack不为空
  while(stack.length > 0) {
    // 当前节点
    const cur = stack.pop()
    // 把当前节点的值加入到res中
    res.push(cur.val)
    
    // 如果当前节点有右子树,则入栈
    cur.right && stack.push(cur.right)
    
    // 如果当前节点有左子树,则入栈
    cur.left && stack.push(cur.left)
  }
  
  return res
}

2.2 递归法

此方法其实没什么好说的,上面的迭代方法能看懂。这个方法就能懂。因为递归就是隐式的用栈

const preorderTraversal = function (root) {
  const res = []
  // 真正的递归过程
  const perorder = function(res, root) {
    // 迭代结束的条件
    if(root === null) return
    res.push(root.val)
    root.left && perorder(res,root.left)
    root.right && perorder(res,root.right)
  }
  perorder(res, root)
  return res
}