【Java树】二叉树遍历的简单实现

二叉树的遍历

二叉树的遍历是值按照一定顺序访问二叉树中所有结点的过程,确保每个结点被访问且仅被访问一次。遍历操作是对二叉树的基础操作,用于后续的查找、排序和路径计算等功能。

二叉树的遍历有以下几种常见方式:深度遍历(DFS)和广度遍历,其中深度遍历分为先序遍历,中序遍历,后序遍历,先、中、后表示对根节点的访问顺序。

二叉树的深度遍历

二叉树的深度遍历是按照树的深度方向进行访问的遍历方式,即尽可能深入到树的某一分支,指导无法继续为止,然后回溯并继续访问其他分支。

深度遍历的关键在于利用递归或栈来记录访问的路径。使用递归的方式可以在栈中保存当前结点,访问结点后再出栈。

递归注意递归规律和递归出口。

对于树:

结点和二叉树:

java 复制代码
// TreeNode.java
// 结点类
public class TreeNode{
	public int data;
	public TreeNode left;
	public TreeNode right;
	
	public TreeNode(int data) {
		this.data=data;
	}
	// 数据的类型决定数据在内存中的存储形式
	@Override
	public String toString() {
		return "TreeNode{" +
				"data = "+ data +
				"\n, left = " + left +
				", right = "+ right+"}";
	}

}
//BalanceTree.java
public class BalanceTree {
	// 虚拟根节点
	public TreeNode root;
//	构建二叉树
	public void insert(int data) {
		TreeNode newnode = new TreeNode(data);
		
		if(root==null) {
			root = newnode;
			return;
		}
		TreeNode currentNode = root;
		while(true) {
			if(newnode.data<currentNode.data) {
				if(currentNode.left!=null) {
					currentNode=currentNode.left;
				}
				else {
					currentNode.left=newnode;
					return;
				}
			}else {
				if(currentNode.right!= null) {
					currentNode=currentNode.right;
				}else {
					currentNode.right=newnode;
					return;
				}
			}
		}
	}
}
先序遍历

先序遍历的顺序:根 -- 左 -- 右

遍历顺序为: 9 2 1 5 4 3 7 6 8 9

java 复制代码
//	递归实现先序遍历
	public void beforeOrder(TreeNode root) {
		TreeNode temp = root;
		if(temp==null) {
			return;
		}
		System.out.print(" " + temp.data);
		beforeOrder(temp.left);
		beforeOrder(temp.right);
	}
中序遍历

中序遍历顺序:左 -- 根 -- 右

遍历顺序为: 1 2 3 4 5 6 7 8 9 9

java 复制代码
//	递归实现中序遍历
	public void inOrder(TreeNode root) {
		if(root==null) {
			return;
		}
		inOrder(root.left);
		System.out.print(" " + root.data);
		inOrder(root.right);
	}
后序遍历

后序遍历顺序:左 -- 右 -- 根

遍历顺序为:1 3 4 6 8 7 5 2 9 9

java 复制代码
//	递归实现后序遍历
	public void afterOrder(TreeNode root) {
		if(root==null) {
			return;
		}
		afterOrder(root.left);
		afterOrder(root.right);
		System.out.print(" " + root.data);
	}

广度优先遍历

使用队列,先把根节点压入队列,再把左右两结点压入队列当中。输出结点后,结点出队,将队列中的下一结点的左右两结点压入队列中,输出结点,结点出队,以此类推。

遍历顺序为:9 2 9 1 5 4 7 3 6 8

java 复制代码
//	广度遍历
	public void levelOrder() {
		LinkedList<TreeNode> queue = new LinkedList<>();

		queue.add(root);
		while(!queue.isEmpty()) {
			TreeNode node= queue.pop();
			System.out.print(node.data+" ");
			if(node.left!=null) {
				queue.add(node.left);
			}
			if(node.right!=null) {
				queue.add(node.right);
			}
		}
	}
相关推荐
前端小刘哥8 分钟前
视频直播点播平台EasyDSS视频直播功能的技术实现与应用场景解析
算法
前端小刘哥10 分钟前
企业运营效率瓶颈?新版视频直播点播平台EasyDSS用视频能力破局!
算法
曦樂~11 分钟前
一些可用于排序的函数(2542. 最大子序列的分数)
算法
源码_V_saaskw21 分钟前
JAVA校园跑腿校园外卖源码校园外卖小程序校园代买帮忙外卖源码社区外卖源码小程序+公众号+h5
java·开发语言·微信小程序·小程序
源码哥_博纳软云27 分钟前
JAVA同城预约服务家政服务美容美发洗车保洁搬家维修家装系统源码小程序+公众号+h5
java·开发语言·微信小程序·小程序
红尘客栈237 分钟前
Kubernetes 集群调度
java·linux·网络·容器·kubernetes
编程岁月43 分钟前
java面试-0203-java集合并发修改异常、快速/安全失败原理、解决方法?
java·开发语言·面试
whltaoin1 小时前
AI 超级智能体全栈项目阶段五:RAG 四大流程详解、最佳实践与调优(基于 Spring AI 实现)
java·人工智能·spring·rag·springai
junnhwan1 小时前
【苍穹外卖笔记】Day05--Redis入门与店铺营业状态设置
java·数据库·redis·笔记·后端·苍穹外卖
colus_SEU1 小时前
【编译原理笔记】2.1 Programming Language Basics
c++·算法·编译原理