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

二叉树遍历

二叉树遍历非递归实现

目录

二叉树遍历非递归实现

树节点定义:

先序遍历:

中序遍历:

后序遍历:

测试代码:

先序遍历测试代码:

中序遍历测试代码:

后序遍历测试代码:


树节点定义:

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);}

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

相关文章:

  • RT-Thread源码阅读(3)——内核对象管理
  • ollama list模型列表获取 接口代码
  • Python打卡第37天
  • Redis与Lua脚本深度解析:原理、应用与最佳实践
  • 【DCCN】多模态情感分析解耦交叉属性关联网络
  • 【Redis】第1节|Redis服务搭建
  • 在Windows上,将 Ubuntu WSL 安装并迁移到 D 盘完整教程(含 Appx 安装与迁移导入)
  • FFmpeg 4.3 H265 二十二.4,使用计算机摄像头,通过VCL软件, 模拟 监控摄像头 的 RTSP 流
  • SDL2常用函数:SDL_BlitSurfaceSDL_UpdateWindowSurface 数据结构及使用介绍
  • Elasticsearch Synthetic _source
  • openpi π₀ 项目部署运行逻辑(三)——策略推理服务器 serve_policy.py
  • OpenCV (C/C++) 中使用 Sobel 算子进行边缘检测
  • Leetcode 3557. Find Maximum Number of Non Intersecting Substrings
  • 如何通过PHPMyadmin对MYSQL数据库进行管理?
  • MQTT-Vue整合
  • 精益数据分析(87/126):市场-产品契合度重构——现有产品寻找新市场的实战指南
  • R 语言科研绘图 --- 热力图-汇总
  • 《软件工程》第 2 章 -UML 与 RUP 统一过程
  • 第11章1 扩展 MySQL
  • Linux连接服务器全攻略:从基础到进阶
  • 网站做收付款接口/网址如何被快速收录
  • 专业建设网站应该怎么做/关键词优化排名软件流量词
  • 480元做网站/湖南seo推广系统
  • 怎么免费做带音乐的网站/公司广告推广方案
  • 网站上线前的准备/怎样优化关键词到首页
  • 开发者选项在哪里打开oppo/免费seo在线优化