前端算法- 二叉树的中序遍历

120 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情

题目

给定一个二叉树的根节点 root ,返回它的中序遍历。

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

题解

这里采用递归的方式进行实现,我们先声明一个res变量,用于存储最后结果默认是空数组,然后在声明一个iteration函数用于递归操作,接受一个r的入参,进入iteration函数后,我们先判断当前出参r是否存在,如果不存在则直接返回,如果存在则将出参r的左节点传给自身进行调用,然后在将当前出参rval属性通过push方法追加到res变量中,然后在将出参r的右节点传给自身进行调用,然后我们在递归函数的外部将当前出参root传递进去,最后待递归函数执行完后将res变量返回即可

/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var inorderTraversal = function(root) {
  let res = []
  let iteration = (r) => {
    if (!r) return
    iteration(r.left)
    res.push(r.val)
    iteration(r.right)
  }
  iteration(root)
  return res
};

这里通过遍历的方式进行实现,我们先声明一个list数组,用于存放中序遍历顺序,在声明一个stack数组,用于控制任务堆栈,模拟递归,在声明一个cur变量指向的是出参root,然后使用循环,循环的条件为当前cur变量或者stack数组数据不为空则进行循环,在循环中我们先判断当前cur变量是否不为空,不为空则使用push方法将cur变量追加到stack数组中,在将出参root左节点赋值给cur变量,如果为空,则使用pop方法获取stack数组的末尾值并赋值给cur变量,在将当前cur变量的val属性通过push方法追加到list数组中,然后在将当前cur变量的右节点赋值给cur变量,当循环完成后,我们直接将list数组返回出去

var inorderTraversal = function(root) {
  let list = [] 
  let stack = [] 
  let cur = root 
  while(cur || stack.length) {
    if (cur) {
      stack.push(cur)
      cur = cur.left 
    } else {
      cur = stack.pop()
      list.push(cur.val)
      cur = cur.right 
    }
  }
  return list
};

坚持努力,无惧未来!