深入理解二叉树遍历:递归与迭代实现


介绍

在数据结构中,二叉树是一种重要且常见的数据结构,它的遍历方式包括先序、中序和后序三种。本文将通过Java语言,详细讲解如何实现这三种遍历方式的递归和迭代版本。

二叉树定义

首先,我们定义二叉树的节点类 TreeNode

class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) {val = x;}
}

先序遍历 (Preorder Traversal)

先序遍历的顺序是:根节点 -> 左子树 -> 右子树。

递归实现
public class BinaryTreeTraversal {// 先序遍历递归实现public void preorderRecursive(TreeNode root) {if (root != null) {System.out.print(root.val + " ");preorderRecursive(root.left);preorderRecursive(root.right);}}
}
迭代实现
import java.util.Stack;public class BinaryTreeTraversal {// 先序遍历迭代实现public void preorderIterative(TreeNode root) {if (root == null) return;Stack<TreeNode> stack = new Stack<>();stack.push(root);while (!stack.isEmpty()) {TreeNode node = stack.pop();System.out.print(node.val + " ");if (node.right != null) {stack.push(node.right);}if (node.left != null) {stack.push(node.left);}}}
}

中序遍历 (Inorder Traversal)

中序遍历的顺序是:左子树 -> 根节点 -> 右子树。

递归实现
public class BinaryTreeTraversal {// 中序遍历递归实现public void inorderRecursive(TreeNode root) {if (root != null) {inorderRecursive(root.left);System.out.print(root.val + " ");inorderRecursive(root.right);}}
}
迭代实现
import java.util.Stack;public class BinaryTreeTraversal {// 中序遍历迭代实现public void inorderIterative(TreeNode root) {if (root == null) return;Stack<TreeNode> stack = new Stack<>();TreeNode current = root;while (current != null || !stack.isEmpty()) {while (current != null) {stack.push(current);current = current.left;}current = stack.pop();System.out.print(current.val + " ");current = current.right;}}
}

后序遍历 (Postorder Traversal)

后序遍历的顺序是:左子树 -> 右子树 -> 根节点。

递归实现
public class BinaryTreeTraversal {// 后序遍历递归实现public void postorderRecursive(TreeNode root) {if (root != null) {postorderRecursive(root.left);postorderRecursive(root.right);System.out.print(root.val + " ");}}
}
迭代实现

后序遍历的迭代实现方法有多种,下面演示两种常见的方法:

方法一:使用两个栈
import java.util.Stack;public class BinaryTreeTraversal {// 后序遍历迭代实现方法一:使用两个栈public void postorderIterative(TreeNode root) {if (root == null) return;Stack<TreeNode> stack1 = new Stack<>();Stack<TreeNode> stack2 = new Stack<>();stack1.push(root);while (!stack1.isEmpty()) {TreeNode node = stack1.pop();stack2.push(node);if (node.left != null) {stack1.push(node.left);}if (node.right != null) {stack1.push(node.right);}}while (!stack2.isEmpty()) {System.out.print(stack2.pop().val + " ");}}
}
方法二:单栈解法,反转结果
import java.util.Stack;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;public class BinaryTreeTraversal {// 后序遍历迭代实现方法二:单栈解法,反转结果public List<Integer> postorderIterative2(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.left != null) {stack.push(node.left);}if (node.right != null) {stack.push(node.right);}}Collections.reverse(result);return result;}
}

总结

本文详细介绍了如何使用Java语言实现二叉树的先序、中序和后序遍历,包括递归和迭代两种实现方式。递归版本简洁明了,迭代版本则展示了如何使用栈来模拟递归过程,确保了遍历的顺序性和正确性。选择适合自己项目需求的遍历方式可以有效提高代码的效率和可读性。

希望本文对你理解二叉树的遍历方式有所帮助!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/45777.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

罗技K380无线键盘及鼠标:智慧互联,一触即通

目录 1. 背景2. K380无线键盘连接电脑2.1 键盘准备工作2.2 电脑配置键盘的连接 3. 无线鼠标的连接3.1 鼠标准备工作3.2 电脑配置鼠标的连接 1. 背景 有一阵子经常使用 ipad&#xff0c;但是对于我这个习惯于键盘打字的人来说&#xff0c;慢慢在 ipad 上打字&#xff0c;实在是…

面试真题 | ARM体系架构基础知识

ARM体系架构基础知识 什么是ARM架构?它有哪些特点和优势? 参考答案 ARM架构(Advanced RISC Machine)是一种处理器架构,广泛应用于移动设备、嵌入式系统和低功耗应用中。以下是ARM架构的一些特点和优势: 简化指令集:ARM采用精简指令集(RISC, Reduced Instruction Set Co…

cv::Mat 操作多维矩阵的思路

现在有一个 [20(rows) * 20(cols) * 144(channels)]的矩阵&#xff0c;我们想截取一个[20 * 20 * 80]的子矩阵&#xff1a; int dims[3] {20, 20, 144}; cv::Mat mat(cv::Size(dims[1], dims[0]), CV_32FC(dims[2]), (void*)input); const std::vector<cv::Range>&…

conda install问题记录

最近想用代码处理sar数据&#xff0c;解放双手。 看重了isce这个处理平台&#xff0c;在安装包的时候遇到了一些问题。 这一步持续了非常久&#xff0c;然后我就果断ctrlc了 后面再次进行尝试&#xff0c;出现一大串报错&#xff0c;不知道是不是依赖项的问题 后面看到说mam…

模块化(一)nodejs

模块化 一.模块化的基本概念1.1 什么是模块化1.2 模块化规范 二.Node.js 中的模块化2.1 Node.js 中模块的分类2.2 加载模块2.3 Node.js 中的模块作用域2.4 向外共享模块作用域中的成员 一.模块化的基本概念 1.1 什么是模块化 模块化 是指解决一个 复杂问题 时&#xff0c;自顶…

从Centos7升级到Rocky linux 9后,网卡连接显示‘Wired connection 1‘问题解决方法

问题描述 从Centos7升级到Rocky9后, 发现网卡eth0的IP不正确。通过nmcli查看网卡连接&#xff0c;找不到name为eth0的连接&#xff0c;只显示’Wired connection 1’ 查看/etc/NetworkManager/system-connections/&#xff0c;发现找不到网卡配置文件。 原因分析 centos7使…

华为OD机试 - 堆内存申请(Java 2024 D卷 100分)

华为OD机试 2024D卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;D卷C卷A卷B卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测…

Hadoop-28 ZooKeeper集群 ZNode简介概念和测试 数据结构与监听机制 持久性节点 持久顺序节点 事务ID Watcher机制

章节内容 上节我们完成了&#xff1a; ZooKeeper 集群配置ZooKeeper 集群启动ZooKeeper 集群状况查看Follower 和 Leader 节点 背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学习。 之前已经在 VM 虚拟机上搭…

基于SpringBoot+Vue的数码论坛系统(带1w+文档)

基于SpringBootVue的数码论坛系统(带1w文档) 基于SpringBootVue的数码论坛系统(带1w文档) 数码论坛系统能够通过互联网得到广泛的、全面的宣传&#xff0c;让尽可能多的用户了解和熟知数码论坛系统的便捷高效&#xff0c;不仅为用户提供了服务&#xff0c;而且也推广了自己&…

【pytorch】手写数字识别

https://blog.csdn.net/qq_45588019/article/details/120935828 基本均参考该博客 《深度学习原理Pytorch实战》 初步处理 导包 import torch import numpy as np from matplotlib import pyplot as plt from torch.utils.data import DataLoader from torchvision import tr…

python pandas处理股票量化数据:笔记3

获取tushare日线数据 示例 pro ts.pro_api()df pro.daily(ts_code000001.SZ, start_date20180701, end_date20180718)#多个股票 df pro.daily(ts_code000001.SZ,600000.SH, start_date20180701, end_date20180718) 或者 df pro.query(daily, ts_code000001.SZ, start_da…

Cypress UI自动化之安装环境

注&#xff1a;macOS系统 一、git环境 略 二、node环境 1、安装nvm 前提&#xff1a;有装过Homebrew&#xff0c;参考adb使用方法文档 1、安装nvm&#xff1a;首先要保证之前没有安装过node&#xff0c;如果之前安装过&#xff0c;先 brew uninstall node brew install n…

计算云服务4

第四章 弹性伸缩服务 什么是弹性伸缩(AS) 弹性伸缩(Auto Scaling&#xff0c;AS)是根据用户的业务需求&#xff0c;通过策略自动调整其业务资源的服务。用户可以根据业务需求自行定义伸缩配置和伸缩策略&#xff0c;降低人为反复调整资源以应对业务变化和高峰压力的工作量&am…

C# 浅谈线程安全的集合ConcurrentQueue

ConcurrentQueue 是 C# 中另一个线程安全的集合&#xff0c;它位于 System.Collections.Concurrent 命名空间中。 Enqueue(T item): 向队列的末尾添加一个元素。如果操作成功&#xff0c;则返回 true。 TryDequeue(out T result): 尝试从队列的开头移除并返回一个元素。如果队列…

Perl语言之标量

Perl对于变量的定义&#xff0c;分为三种类型&#xff1a;标量、数组和哈希。   标量是 Perl 语言中最简单的一种数据类型。标量中可以存储整数、字符串、浮点数、字符等&#xff0c;数据格式不做严格区分。在使用标量时需要再变量前面加$&#xff0c;如&#xff1a; #! /us…

IOS热门面试题一

GCD&#xff08;Grand Central Dispatch&#xff09;是什么&#xff1f;如何在iOS中使用它&#xff1f; GCD&#xff08;Grand Central Dispatch&#xff09;是什么&#xff1f; GCD&#xff08;Grand Central Dispatch&#xff09;是苹果公司开发的一套多线程编程的API&…

C语言 | Leetcode C语言题解之第231题2的幂

题目&#xff1a; 题解&#xff1a; const int BIG 1 << 30;bool isPowerOfTwo(int n) {return n > 0 && BIG % n 0; }

为什么远程办公不被公司普遍接受?

为什么远程办公不被公司普遍接受? 如果说传统企业不接受远程公办,那么为什么互联网企业也不接受远程办公呢? VPN 虚拟专用网络(Virtual Private Network) VPN 是远程办公的基石,没有VPN远程办公处处受限。什么是VPN呢? 它能实现跨地域,不受地域限制地把办公室网络和个…

深入掌握:Linux常用命令大全

深入掌握&#xff1a;Linux常用命令大全 Linux系统凭借其稳定性、安全性和强大的功能&#xff0c;广泛应用于服务器、开发、嵌入式系统等各个领域。对于初学者和经验丰富的用户来说&#xff0c;掌握Linux常用命令是高效操作系统的基础。本文将详细介绍超过8000字的Linux常用命…

暑期备考美国数学竞赛AMC8和AMC10:吃透1850道真题和知识点

距离接下来的AMC8、AMC10美国数学竞赛还有几个月的时间&#xff0c;实践证明&#xff0c;做真题&#xff0c;吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一。 通过做真题&#xff0c;可以帮助孩子找到真实竞赛的感觉&#xff0c;而且更加贴近比赛的内容&#xff0c;…