【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);
			}
		}
	}
相关推荐
程序修理员几秒前
技能点总结
java
Jennifer33K15 分钟前
报错_NoSuchMethodException: cn.mvc.entity.User.<init>()
java
爱吃烤鸡翅的酸菜鱼18 分钟前
【SpringMVC】概念引入与连接
java·开发语言·mysql
碎梦归途20 分钟前
23种设计模式-行为型模式之策略模式(Java版本)
java·开发语言·jvm·设计模式·策略模式·行为型模式
三个蔡33 分钟前
Java求职者面试:从Spring Boot到微服务的技术深度探索
java·大数据·spring boot·微服务·kubernetes
sniper_fandc1 小时前
JVM(Java虚拟机)详解
java·开发语言·jvm
小鸡脚来咯1 小时前
SpringBoot 常用注解通俗解释
java·spring boot·后端
雾削木1 小时前
mAh 与 Wh:电量单位的深度解析
开发语言·c++·单片机·嵌入式硬件·算法·电脑
__lost1 小时前
小球在摆线上下落的物理过程MATLAB代码
开发语言·算法·matlab
AI的魔盒1 小时前
基于Java与MAVLink协议的多无人机(Cube飞控)集群控制与调度方案问题
java·开发语言·无人机