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

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

题目描述

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

前序遍历

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

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
};
复制代码

总结

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

目录
打赏
0
0
0
0
6
分享
相关文章
数据结构实验之求二叉树后序遍历和层次遍历
数据结构实验之求二叉树后序遍历和层次遍历
|
10月前
leetcode-590:N 叉树的后序遍历
leetcode-590:N 叉树的后序遍历
67 0
08_N叉树的层序遍历
08_N叉树的层序遍历
589. N 叉树的前序遍历
589. N 叉树的前序遍历
46 0
【二叉树OJ题(二)】前序遍历&&中序遍历&&后序遍历&&另一颗树的子树&&二叉树遍历&&平衡二叉树(上)
【二叉树OJ题(二)】前序遍历&&中序遍历&&后序遍历&&另一颗树的子树&&二叉树遍历&&平衡二叉树(上)
【二叉树OJ题(二)】前序遍历&&中序遍历&&后序遍历&&另一颗树的子树&&二叉树遍历&&平衡二叉树(下)
【二叉树OJ题(二)】前序遍历&&中序遍历&&后序遍历&&另一颗树的子树&&二叉树遍历&&平衡二叉树(下)
刷题之完全二叉树的权值和小字辈及根据后序和中序遍历输出先序遍历
刷题之完全二叉树的权值和小字辈及根据后序和中序遍历输出先序遍历
156 0
【C++】非递归实现二叉树的前中后序遍历
【C++】非递归实现二叉树的前中后序遍历
【C++】非递归实现二叉树的前中后序遍历
前序遍历+中序遍历重建二叉树
前序遍历+中序遍历重建二叉树
173 0
前序遍历+中序遍历重建二叉树
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等