【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);
			}
		}
	}
相关推荐
vibecoding日记1 小时前
双非如何快速入职字节等大厂大模型?真实案例分析:推理优化和投机解码
算法·求职·大模型工程师
yszaygr21383 小时前
Verilog参数化游程编码RLE模块
算法
SamDeepThinking3 小时前
从源码到代码:MyBatis-Flex 与 MyBatis-Plus 的逐项对比
java·后端·程序员
望易3 小时前
刚设计的大模型架构-双域耦合认知框架
算法·架构
她的男孩6 小时前
Spring Boot 接 Flowable 工作流:用 3 个注解搭一个请假审批流程
java·后端·架构
复杂网络7 小时前
多个 Claude Code 与多个 Codex 协同工作:设计与实现方案
算法
荣码7 小时前
LLM结构化输出:让AI返回JSON而不是废话,我踩了4个坑
java·python
plainGeekDev9 小时前
Gson → kotlinx.serialization
android·java·kotlin