leetcode 刷题 day14

主线任务】掌握二叉树前中后序遍历的递归法、迭代法和统一迭代法(统一迭代法还没掌握,已经晕了🌹)
递归
1. 确定参数及返回值
2. 确定终止条件
3. 确定单次执行逻辑

  • 前序遍历
    递归法思路
    请添加图片描述
    迭代法思路】递归函数底层实现也是用栈,所以我们可以模拟栈来实现二叉树的遍历:按 “中左右” 的顺序依次把元素放入栈中,再 pop(),放入数组中,循环直至栈为空。
// 递归解法
var preorderTraversal = function(root) {
  const res = [];
  const dif = root => {
    if (root === null) return;
    res.push(root.val);  // 中
    dif(root.left);  // 左
    dif(root.right);  // 右
  }

  dif(root);
  return res;
};

// 迭代解法
var preorderTraversal = function (root) {
  if (!root) return [];
  let stack = [root], res = [];

  while (stack.length) {
    let cur = stack.pop();
    res.push(cur.val);
    cur.right && stack.push(cur.right);
    cur.left && stack.push(cur.left);
  }

  return res;
}
  • 后序遍历
    递归法思路】三种遍历的递归法其实差不多,按照后序遍历子树的顺序依次执行 “左右中” 的代码逻辑即可。
    迭代法思路】后序遍历的方法和坐了前序遍历代码的顺风车。前序遍历顺序:“中左右”,入栈顺序为先右子树后左子树,把入站顺序改为先左子树后右子树顺序入栈,变为 “中右左”,再把得到的数组 reverse(),即可得到 ”左右中“ 的顺序。
// 递归解法
var postorderTraversal = function(root) {
  let res = [];
  const traversal = (root) => {
    if (root === null) return;

    traversal(root.left);
    traversal(root.right);
    res.push(root.val);
  }
  traversal(root);
  return res;
};

// 迭代解法
var postorderTraversal = (root) => {
  if (!root) return [];
  let stack = [root], res = [];

  while (stack.length) {
    let cur = stack.pop();
    res.push(cur.val);
    cur.left && stack.push(cur.left);
    cur.right && stack.push(cur.right);
  }

  return res.reverse();
}
  • 中序遍历
    递归法思路】三种遍历的递归法其实差不多,按照中序遍历子树的顺序依次执行 “左中右” 的代码逻辑即可。
    迭代法思路】此时入栈顺序和要遍历的顺序不一样,所以不能沿用前序遍历的思路。要先把元素都入栈(cur = cur.left)直至到第一个要遍历的元素为止( cur === null),然后 pop() 栈中的元素,添加到数组 res 中,再检查有没有右子树(cur = cur.right)。若有右子树就存入栈中检查是否有左子树,没有则继续 pop() 栈中元素。
// 递归解法
var inorderTraversal = function(root) {
  let res = [];
  const trasversal = (root) => {
    if (root === null) return;
    trasversal(root.left);
    res.push(root.val);
    trasversal(root.right);
  }

  trasversal(root);
  return res;
};

// 迭代解法
var inorderTraversal = function (root) {
  let stack = [], cur = root, res = [];

  while (cur !== null || stack.length) {
    if (cur !== null) {
      stack.push(cur);
      cur = cur.left;
    } else {
      cur = stack.pop();
      res.push(cur.val);
      cur = cur.right;
    }
  }

  return res;
}

参考代码随想录:https://www.programmercarl.com/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值