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

二叉树前序遍历的 Java 实现,包括递归和非递归两种方式

二叉树前序遍历是一种遍历树节点的方式,遵循特定的顺序。其基本过程可以总结为以下几个步骤:

前序遍历的顺序
访问根节点:首先处理当前节点。
递归遍历左子树:然后依次访问左子树。
递归遍历右子树:最后访问右子树。
这种遍历方式的特点是每次都会先处理根节点,再处理左右子树,因此叫做“前序”。

例子
考虑下面的二叉树:

    A/ \B   C/ \
D   E

前序遍历的步骤:

访问根节点 A
递归访问左子树:
访问 B
递归访问 B 的左子树:
访问 D
递归访问 B 的右子树:
访问 E
递归访问右子树:
访问 C
前序遍历的结果:A, B, D, E, C

特点
树的结构:前序遍历能够保存树的结构。通过前序遍历的结果,可以恢复出原来的树形结构。
适用场景:在某些场景下,例如复制树或者进行某些类型的树形操作,前序遍历是非常有效的。
递归与非递归:前序遍历可以通过递归和非递归(使用栈)两种方式实现。
时间复杂度
前序遍历的时间复杂度为 O(n),其中 n 是树中节点的总数,因为每个节点都要被访问一次。

空间复杂度
递归实现的空间复杂度为 O(h),h 是树的高度,主要由递归调用栈占用。
非递归实现的空间复杂度也是 O(h),因为栈中存储的节点数不超过树的高度。

下面是二叉树前序遍历的 Java 实现,包括递归和非递归两种方式。

  1. 递归实现
class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) {val = x;}
}import java.util.ArrayList;
import java.util.List;public class PreorderTraversal {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<>();traverse(root, result);return result;}private void traverse(TreeNode node, List<Integer> result) {if (node != null) {result.add(node.val); // 访问根节点traverse(node.left, result); // 递归左子树traverse(node.right, result); // 递归右子树}}
}

2. 非递归实现

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;public class PreorderTraversalIterative {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<>();if (root == null) {return result;}Stack<TreeNode> stack = new Stack<>();stack.push(root);while (!stack.isEmpty()) {TreeNode node = stack.pop();result.add(node.val); // 访问根节点if (node.right != null) {stack.push(node.right); // 先右后左入栈}if (node.left != null) {stack.push(node.left);}}return result;}
}

示例使用
假设有如下的二叉树:

// 创建二叉树
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);// 递归遍历
PreorderTraversal pt = new PreorderTraversal();
List<Integer> result = pt.preorderTraversal(root);
System.out.println(result); // 输出: [1, 2, 4, 5, 3]// 非递归遍历
PreorderTraversalIterative pti = new PreorderTraversalIterative();
List<Integer> resultIterative = pti.preorderTraversal(root);
System.out.println(resultIterative); // 输出: [1, 2, 4, 5, 3]
http://www.lryc.cn/news/471280.html

相关文章:

  • QT开发:构建现代UI的利器:深入详解QML和Qt Quick基础开发技术
  • vue前端使用pdfjs与pdfdist-mergeofd 实现预览pdf并翻页,同时解决预览pdf显示模糊的问题
  • C语言——回调函数
  • 2016年ATom-1飞行活动期间以10秒间隔进行的一氧化碳(CO)观测数据
  • MLM之Emu3:Emu3(仅需下一个Token预测)的简介、安装和使用方法、案例应用之详细攻略
  • Spring Boot与Flyway实现自动化数据库版本控制
  • input角度:I2C触摸屏驱动分析和编写一个简单的I2C驱动程序
  • SQL-lab靶场less1-4
  • 【生成模型之二】diffusion model模型
  • 记录 Maven 版本覆盖 Bug 的解决过程
  • 【K8S系列】Kubernetes Service 基础知识 详细介绍
  • python在物联网领域的数据应用分析与实战!
  • 目标跟踪算法-卡尔曼滤波详解
  • SpringBoot后端开发常用工具详细介绍——application多环境配置与切换
  • php反序列化漏洞典型例题
  • 浅析Android View绘制过程中的Surface
  • 基于卷积神经网络的大豆种子缺陷识别系统,resnet50,mobilenet模型【pytorch框架+python源码】
  • HarmonyOS项目开发一多简介
  • C++基础三
  • 利用ChatGPT完成2024年MathorCup大数据挑战赛-赛道A初赛:台风预测与分析
  • Linux系统操作篇 one -文件指令及文件知识铺垫
  • 隨筆20241028 ISR 的收缩与扩展及其机制解析
  • linux-字符串相关命令
  • ES6 函数的扩展
  • Mac 查看占用特定端口、终止占用端口的进程
  • C#入坑JAVA MyBatis入门 CURD 批量 联表分页查询
  • RabbitMQ 安装(Windows版本)和使用
  • Apache paimon表管理
  • java 第19天
  • 什么是服务器?服务器与客户端的关系?本地方访问不了网址与服务器访问不了是什么意思?有何区别