【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);
			}
		}
	}
相关推荐
东阳马生架构9 小时前
商品中心—6.商品考核系统的技术文档
java
晴空月明9 小时前
Java 内存模型与 Happens-Before 关系深度解析
java
皮皮林55113 小时前
SpringBoot 加载外部 Jar,实现功能按需扩展!
java·spring boot
rocksun13 小时前
认识Embabel:一个使用Java构建AI Agent的框架
java·人工智能
Java中文社群14 小时前
AI实战:一键生成数字人视频!
java·人工智能·后端
王中阳Go15 小时前
从超市收银到航空调度:贪心算法如何破解生活中的最优决策谜题?
java·后端·算法
shepherd11115 小时前
谈谈TransmittableThreadLocal实现原理和在日志收集记录系统上下文实战应用
java·后端·开源
维基框架15 小时前
Spring Boot 项目整合Spring Security 进行身份验证
java·架构
故事挺秃然16 小时前
中文分词:机械分词算法详解与实践总结
算法·nlp
日月星辰Ace16 小时前
Java JVM 垃圾回收器(四):现代垃圾回收器 之 Shenandoah GC
java·jvm