当前位置: 首页 > wzjs >正文

专门做衬衣网站站长之家怎么找网址

专门做衬衣网站,站长之家怎么找网址,b2c跨境电商有哪些平台,吉林一站式网站建设介绍二叉树的 前序遍历(根-左-右)和 后序遍历(左-右-根)是算法中的经典问题。虽然递归实现简单,但迭代法更能锻炼对栈操作的理解。本文将通过代码解析和出入栈模拟,彻底讲透这两种遍历的迭代实现,并…

二叉树的 前序遍历(根-左-右)和 后序遍历(左-右-根)是算法中的经典问题。虽然递归实现简单,但迭代法更能锻炼对栈操作的理解。本文将通过代码解析和出入栈模拟,彻底讲透这两种遍历的迭代实现,并揭示它们之间的巧妙联系。


一、前序遍历迭代法

1. 核心思路

前序遍历顺序:根节点 → 左子树 → 右子树。
迭代法核心:利用栈的 “先进后出” 特性,确保根节点先被访问,再处理左右子树。
关键操作

  • 根节点入栈 → 弹出根节点并记录 → 先右子节点入栈再左子节点入栈
  • 这样,左子树会先于右子树被处理。

2. 代码逐行解析

class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();Stack<TreeNode> stack = new Stack<>();if (root != null) {stack.push(root); // 根节点入栈}while (!stack.isEmpty()) {TreeNode node = stack.pop(); // 弹出当前节点res.add(node.val);          // 记录根节点值// 右子节点先入栈(保证左子树先处理)if (node.right != null) {stack.push(node.right);}// 左子节点后入栈(后进先出)if (node.left != null) {stack.push(node.left);}}return res;}
}

3. 出入栈模拟(以二叉树 [1,2,3,4,5] 为例)

      1/ \2   3/ \4   5

前序遍历结果应为 [1,2,4,5,3]。栈的变化如下:

当前栈顶节点操作结果 res栈内容(底→顶)
1弹出 1,右3入栈,左2入栈[1][3,2]
2弹出 2,右5入栈,左4入栈[1,2][3,5,4]
4弹出 4,无子节点[1,2,4][3,5]
5弹出 5,无子节点[1,2,4,5][3]
3弹出 3,无子节点[1,2,4,5,3][]

二、后序遍历迭代法

1. 核心思路

后序遍历顺序:左子树 → 右子树 → 根节点。
迭代法核心

  • 逆向思维:前序遍历顺序为 根-左-右,若调整入栈顺序为 根-右-左,再将结果反转,即得到 左-右-根
  • 关键操作
    1. 根节点入栈 → 弹出根节点并记录 → 左子节点入栈 → 右子节点入栈。
    2. 最终反转结果列表。

2. 代码逐行解析

class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();Stack<TreeNode> stack = new Stack<>();if (root != null) {stack.push(root); // 根节点入栈}while (!stack.isEmpty()) {TreeNode node = stack.pop(); // 弹出当前节点res.add(node.val);          // 记录根节点值// 左子节点先入栈(保证右子树先处理)if (node.left != null) {stack.push(node.left);}// 右子节点后入栈(后进先出)if (node.right != null) {stack.push(node.right);}}Collections.reverse(res); // 反转结果return res;}
}

3. 出入栈模拟(以二叉树 [1,2,3,4,5] 为例)

后序遍历结果应为 [4,5,2,3,1]。栈的变化如下:

当前栈顶节点操作中间结果(未反转)栈内容(底→顶)
1弹出 1,左2入栈,右3入栈[1][2,3]
3弹出 3,无子节点[1,3][2]
2弹出 2,左4入栈,右5入栈[1,3,2][4,5]
5弹出 5,无子节点[1,3,2,5][4]
4弹出 4,无子节点[1,3,2,5,4][]
反转结果[4,5,2,3,1]

三、前序与后序遍历的关系

1. 核心规律

  • 前序遍历顺序:根 → 左 → 右
  • 调整后的前序顺序:根 → 右 → 左
  • 反转结果 → 后序遍历顺序:左 → 右 → 根

2. 为什么这样可行?

  • 调整入栈顺序后,实际遍历顺序为 根-右-左(例如 [1,3,2,5,4])。
  • 反转后得到 左-右-根(例如 [4,5,2,3,1]),即后序遍历结果。

四、关键知识点总结

1. 栈的作用

  • 模拟递归调用:显式栈替代系统栈,避免递归深度过大导致的栈溢出。
  • 控制访问顺序:通过入栈顺序调整遍历方向。

2. 时间复杂度与空间复杂度

  • 时间复杂度:O(n),每个节点恰好入栈和出栈一次。
  • 空间复杂度:O(n),最坏情况下栈存储所有节点。

3. 前序与后序的对比

遍历方式入栈顺序中间结果最终结果
前序遍历右 → 左根-左-右无需反转
后序遍历左 → 右根-右-左反转结果

五、完整代码

// 前序遍历
class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();Stack<TreeNode> stack = new Stack<>();if (root != null) stack.push(root);while (!stack.isEmpty()) {TreeNode node = stack.pop();res.add(node.val);if (node.right != null) stack.push(node.right);if (node.left != null) stack.push(node.left);}return res;}
}// 后序遍历
class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();Stack<TreeNode> stack = new Stack<>();if (root != null) stack.push(root);while (!stack.isEmpty()) {TreeNode node = stack.pop();res.add(node.val);if (node.left != null) stack.push(node.left);if (node.right != null) stack.push(node.right);}Collections.reverse(res);return res;}
}

六、总结

  • 前序遍历:根节点先行,通过 “右左入栈” 保证顺序。
  • 后序遍历:调整前序入栈顺序为 “左右入栈”,反转结果即可。
  • 栈操作的核心:理解入栈顺序如何影响遍历方向,并利用反转技巧简化问题。
    掌握这一思路后,可以轻松应对其他二叉树遍历问题的迭代实现!
http://www.dtcms.com/wzjs/40000.html

相关文章:

  • 可口可乐公司建设网站的目的是什么意思搜索引擎优化管理实验报告
  • 北京网站制作一般多少钱曲靖新闻今日头条
  • 香港市建设局官方网站广东网站营销seo费用
  • 可信网站多少钱中国互联网域名注册服务机构
  • 北京网站建设公司华网制作作网站推广该怎么做
  • 销售app哪个好用沈阳企业网站seo公司
  • 建设大型的企业网站费用商家推广平台有哪些
  • 廊坊网站百度提交收录入口
  • 西山网站建设网络推广要求
  • 请人建设网站 要注意什么seo网站推广的主要目的
  • 网站怎么做推广和宣传友情链接检索数据分析
  • 网站动态画面用啥做关键词在线听免费
  • 工商网站如何做企业增资广州谷歌推广
  • 毕设做网站需要发布到浏览器吗web网站模板
  • 淄博有做网站的吗西安seo高手
  • 网站域名申请怎么做怎么快速优化网站排名
  • 网站建设如何自学白酒最有效的推广方式
  • 电商网站建设考试二级域名注册
  • abm跨境电商平台seo程序
  • 建一个网站怎么赚钱吗盘多多搜索引擎入口
  • 做二手房需要用到哪些网站搜集房源泰安网站优化公司
  • 怎样做心理咨询网站视频优化是什么意思
  • 专门做ppt的网站seo教程排名第一
  • 网站前台后台模板下载青岛网站建设微动力
  • 惠州的企业网站建设拓客渠道有哪些
  • 深圳龙岗做网站公司哪家好国内真正的永久免费砖石
  • 一个专门做熊的网站bt种子搜索
  • 品牌建设的步骤惠州百度seo哪里强
  • 安阳网红专业搜索引擎seo合作
  • 微商官网关键词优化设计