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

二叉树遍历

二叉树遍历非递归实现

目录

二叉树遍历非递归实现

树节点定义:

先序遍历:

中序遍历:

后序遍历:

测试代码:

先序遍历测试代码:

中序遍历测试代码:

后序遍历测试代码:


树节点定义:

public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val = val; }TreeNode(int val, TreeNode left, TreeNode right) {this.val = val;this.left = left;this.right = right;}
}

先序遍历:

    /*** 前序遍历二叉树* @param root* @return*/public List<Integer> preorderTraversal(TreeNode root) {Stack<TreeNode> stack = new Stack<>();List<Integer> list = new LinkedList<>();while (root != null || !stack.isEmpty()) {if (root != null) {// 先访问根节点list.add(root.val);stack.push(root);// 然后访问左子树root = root.left;} else {// 如果没有左子树,访问右子树root = stack.pop();root = root.right;}}return list;}

中序遍历:

    /*** 中序遍历二叉树* @param root* @return*/public List<Integer> inorderTraversal(TreeNode root) {Stack<TreeNode> stack = new Stack<>();List<Integer> list = new LinkedList<>();while (root != null || !stack.isEmpty()) {if (root!=null){stack.push(root);//先访问左子树root = root.left;}else {root = stack.pop();//访问根节点list.add(root.val);//访问右子树root = root.right;}}return list;}

后序遍历:

    /*** 后序遍历二叉树* @param root* @return*/public List<Integer> postorderTraversal(TreeNode root) {Stack<TreeNode> stack = new Stack<>();List<Integer> list = new LinkedList<>();// 记录上一个访问的节点TreeNode lastVisited = null;while (root != null || !stack.isEmpty()) {if (root != null) {stack.push(root);// 先访问左子树root = root.left;} else {TreeNode peekNode = stack.peek();// 如果右子树不存在或已经被访问过,则访问当前节点if (peekNode.right == null || peekNode.right == lastVisited) {list.add(peekNode.val);// 更新上一个访问的节点lastVisited = stack.pop();} else {// 否则访问右子树root = peekNode.right;}}}return list;}

层序遍历:

    /*** 层序遍历二叉树* @param root* @return*/public List<Integer> levelorderTraversal(TreeNode root) {List<Integer> list = new LinkedList<>();// 如果根节点为空,直接返回空列表if (root == null) {return list;}LinkedList<TreeNode> queue = new LinkedList<>();queue.add(root);while (!queue.isEmpty()) {TreeNode node = queue.poll();list.add(node.val);if (node.left != null) {queue.add(node.left);}if (node.right != null) {queue.add(node.right);}}return list;}

测试代码:

先序遍历测试代码:

    /*** 测试前序遍历*/@Testpublic void testPreorderTraversal() {TreeNode root = new TreeNode(1);root.left = new TreeNode(2);root.right = new TreeNode(3);root.left.left = new TreeNode(4);root.left.right = new TreeNode(5);BinaryTree binaryTree = new BinaryTree();List<Integer> result = binaryTree.preorderTraversal(root);// 输出: [1, 2, 4, 5, 3]System.out.println(result);}

中序遍历测试代码:

    /*** 测试中序遍历*/@Testpublic void testInorderTraversal() {TreeNode root = new TreeNode(1);root.left = new TreeNode(2);root.right = new TreeNode(3);root.left.left = new TreeNode(4);root.left.right = new TreeNode(5);BinaryTree binaryTree = new BinaryTree();List<Integer> result = binaryTree.inorderTraversal(root);// 输出: [4, 2, 5, 1, 3]System.out.println(result);}

后序遍历测试代码:

    /*** 测试后序遍历*/@Testpublic void testPostorderTraversal() {TreeNode root = new TreeNode(1);root.left = new TreeNode(2);root.right = new TreeNode(3);root.left.left = new TreeNode(4);root.left.right = new TreeNode(5);BinaryTree binaryTree = new BinaryTree();List<Integer> result = binaryTree.postorderTraversal(root);// 输出: [4, 5, 2, 3, 1]System.out.println(result);}

层序遍历测试代码:

    /*** 测试层序遍历*/@Testpublic void testLevelorderTraversal() {TreeNode root = new TreeNode(1);root.left = new TreeNode(2);root.right = new TreeNode(3);root.left.left = new TreeNode(4);root.left.right = new TreeNode(5);BinaryTree binaryTree = new BinaryTree();List<Integer> result = binaryTree.levelorderTraversal(root);// 输出: [1, 2, 3, 4, 5]System.out.println(result);}

注:深度优先搜索策略与广度优先搜索策略暂不在本文探讨范围。

http://www.xdnf.cn/news/9106.html

相关文章:

  • 打破壁垒:国内软件业产品与技术割裂困局及工程师产品思维重塑
  • 无网络docker镜像迁移
  • OSC协议简介、工作原理、特点、数据的接收和发送
  • 5月26日day37打卡
  • 【大模型Pre-Training实战总结】实现Qwen3增量预训练,Lora训练与合并
  • 修改mysql 数据库密码记录
  • MySQL数据库零基础入门教程:从安装配置到数据查询全掌握
  • 2025年AIR SCI1区TOP,具有新变异策略和外部存档机制mLSHADE-SPACMA+数值优化与点云配准,深度解析+性能实测
  • 【2025】harbor仓库搭建
  • MAR:无需量化的掩码自回归图像生成模型
  • Windows Server 2016 下封禁端口规避高危漏洞的测试实践
  • 通过chrome插件自动生成博客评论,高效发外链
  • 15.2【基础项目】使用 TypeScript 实现密码显示与隐藏功能
  • wsl2 安装 nodejs
  • 人工智能与教育科技:2025年个性化学习的新模式
  • (C++17) 未捕获异常 uncaught_exceptions
  • Java基础 Day21
  • 从无符号长整型数中提取字节
  • 【Redis】Redis安装
  • 红外遥控器接收实验:CubeMX配置底层软件
  • 基于vue框架的动漫网站noww0(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 【windwos】文本编辑器Notepad++ 替代品Notepad--
  • 汇川伺服软件设置提示使能冲突
  • 深入解读Qwen3技术报告(五):后训练对齐
  • Linux系统调用深度剖析
  • 佳易王商品进出库管理系统:数字化库存管理的全能解决方案#海鲜蔬果批发管理#批发出库管理
  • 双臂机器人运动空间与干涉分析仿真技术报告
  • 功能“递归模式”在 C# 7.3 中不可用,请使用 8.0 或更高的语言版本的一种兼容处理方案
  • 【产品经理】如何撰写产品文档
  • 解锁webpack:处理跨域devserver、摇树treeshaking、图片压缩sharp