迭代法实现对二叉树的前中后序遍历

246 阅读2分钟

题目描述

对二叉树的遍历是面试中常出现的题目,二叉树的前中后序遍历可以通过递归实现,也可以通过迭代实现,递归的方式在实际使用时,可能会面临内存溢出的风险,所以掌握迭代法的遍历方式,对我们也是很关键的,让我们来一起学会如何通过迭代法来遍历二叉树吧!

前序遍历

首先,将根节点入栈,然后出栈的时候记录其值,同时判断其是否存在右子树和左子树,其中先判断右子树,再判断左子树,存在的话则将其压入栈中,然后循环遍历栈,直到栈为空。

var preorderTraversal = function (root) {

  if (!root) return [];
  // 定义最终返回的结果
  let result = [];
  // 定义栈
  const stack = [root];

  // 只要栈中有元素则进入循环
  while (stack.length) {
    let node = stack.pop();
    result.push(node.val);
    // 如果右孩子存在的话
    node.right && stack.push(node.right);
    node.left && stack.push(node.left);
  }
  return result;

};

中序遍历

中序遍历的迭代法核心思想在于先遍历完左子树,然后遍历根节点,然后遍历右子树,先使用while循环,遇到左子节点,就让左子节点入栈,如果出栈元素有右子树,就让当前节点指向这颗右子树。

var inorderTraversal = function(root) {
  // 如果节点为空的情况
  if (!root) return [];
  // 定义最终返回的结果
  const result = [];
  // 当前处理节点
  let cur = root;
  // 定义辅助栈
  let stack = [];
  // 核心循环
  while (stack.length || cur) {
    // 首先遍历左子树
    while (cur) {
      stack.push(cur);
      cur = cur.left;
    }
    // 出栈,存储
    let node = stack.pop();
    result.push(node.val);
    if (node.right) {
      cur = node.right
    }
  }
  return result;
};

后序遍历

后序遍历的迭代法核心思路在于,将当前节点的值优先插入栈首,然后左孩子存在将左孩子入栈,右孩子存在将右孩子入栈。

var postorderTraversal = function(root) {
  if (!root) return []
  // 定义最终返回的结果
  let result = [];
  // 定义辅助栈
  let stack = [root];
  // 只要栈不为空就循环
  while (stack.length) {
    let node = stack.pop();
    result.unshift(node.val);
    // 记住,此处是先左后右
    node.left && stack.push(node.left);
    node.right && stack.push(node.right);
  }
  return result
};

总结

二叉树前中后序遍历的迭代法是非常重要的思路,主要是借助辅助栈来帮助我们遍历,无论是在工作中还是在面试中,这些思路都会帮助我们写出更加精致的代码。