【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);
			}
		}
	}
相关推荐
xiaohiiii12 分钟前
2022年上半年软件设计师下午题题目详解与知识点解析(附真题及答案)
java·数据库·职场和发展·uml
坚定信念,勇往无前15 分钟前
解决idea一个非常坑的问题
java·ide·intellij-idea
Ritsu栗子26 分钟前
代码随想录算法训练day63---图论系列7《prim算法&kruskal算法》
c++·算法·图论
web1376560764327 分钟前
Apache Tomcat RCE 稳定复现 保姆级!(CVE-2024-50379)附视频+POC
java·tomcat·apache
C_V_Better28 分钟前
Java 中的 List 和 Map:全面解析与实际应用
java·list
0_alan_28 分钟前
Java 使用注解实现Redisson分布式锁
java·开发语言·分布式
带刺的坐椅32 分钟前
用 solon-ai 写个简单的 deepseek 程序(构建全国产 ai 智能体应用)
java·solon·deepseek
一只码代码的章鱼33 分钟前
数据结构与算法-图论-最短路-单源最短路的建图方式
算法·图论
老朋友此林34 分钟前
浅谈 Redis 主从集群原理(一)
java·数据库·redis
黄金龙PLUS42 分钟前
十分简单的流密码算法RC4
算法·网络安全·密码学·哈希算法·同态加密