一、树的遍历分类
1.深度优先(DFS)
- 前序遍历
- 中序遍历
- 后序遍历
2.广度优先(BFS)
- 层序遍历
二、代码实现
首先创建二叉树的节点 TreeNode 类
public class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int val) {
this.val = val;
}
}
接下来才是具体的二叉树遍历
public class BinaryTreeTraverse {
// 二叉树的前序遍历:根节点 - 左子树 - 右子树
public void firstTraverse(TreeNode node) {
if (node == null) {
return;
}
System.out.println(node.val);
firstTraverse(node.left);
firstTraverse(node.right);
}
// 二叉树的中序遍历:左子树 - 根节点 - 右子树
public void inTraverse(TreeNode node) {
if (node == null) {
return;
}
inTraverse(node.left);
System.out.println(node.val);
inTraverse(node.right);
}
// 二叉树的后序遍历:左子树 - 右子树 - 根节点
public void afterTraverse(TreeNode node) {
if (node == null) {
return;
}
afterTraverse(node.left);
afterTraverse(node.right);
System.out.println(node.val);
}
// 二叉树的层序遍历
public void levelTraverse(TreeNode root) {
/*
二叉树层序遍历的逻辑:
先将 root 加入到队列中,然后遍历这个队列。将队列中的首元素出队列,输出首元素的值,
再将首元素的 left 和 right 入队列,循环直到队列中没有元素为止。
遍历过程是这样的:
root - root.left - root.right - root.left.left - root.left.right -
root.right.left - root.right.right...
*/
LinkedList<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
TreeNode node = queue.pop();
System.out.println(node.val);
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
}
}
// 这里采用最为简单粗暴的方式来创建一个二叉树
private TreeNode createBinaryTree() {
TreeNode node1 = new TreeNode(1); // root
TreeNode node2 = new TreeNode(2);
TreeNode node3 = new TreeNode(3);
TreeNode node4 = new TreeNode(4);
TreeNode node5 = new TreeNode(5);
TreeNode node6 = new TreeNode(6);
TreeNode node7 = new TreeNode(7);
TreeNode node8 = new TreeNode(8);
TreeNode node9 = new TreeNode(9);
node1.left = node2;
node1.right = node3;
node2.left= node4;
node2.right = node5;
node3.left = node6;
node4.left = node7;
node4.right = node8;
node8.right = node9;
return node1;
}
}