二叉树的遍历
本题要求实现给定二叉树的4种遍历(如下图)。
要求4个函数分别按照访问顺序打印出结点的内容,格式为一个空格跟着一个字符。
输出样例(对于图中给出的树):
Inorder:
D
B
E
F
A
G
H
C
I
Preorder: A B
D
F
E
C
G
H
I
Postorder:D
E
F
B
H
G
I
C
A
Levelorder:A
B
C
D
F
G
I
E
H
首先定义一个Node节点类,代码如下:
class Node {
String val;
Node left;
Node right;
Node(String val) {
this.val = val;
}
}
前序遍历(Preorder Traversal)的访问顺序:根节点à前序遍历左子树à前序遍历右子树
先序遍历的代码实现首先先判断根节点是否为空,为空就遍历就结束了;代码如下:
// 前序遍历
public static void preorderTraversal(Node root) {
if (root == null) {
return;
}
System.out.print(root.val + " ");
preorderTraversal(root.left);
preorderTraversal(root.right);
}
中序遍历(Inorder Traversal)的访问顺序:中序遍历左子树à根节点à中序遍历右子树
中序遍历的代码实现可以根据先序遍历的代码进行转换即可,代码如下:
// 中序遍历
public static void inorderTraversal(Node root) {
if (root == null) {
return;
}
inorderTraversal(root.left);
System.out.print(root.val + " ");
inorderTraversal(root.right);
}
后序遍历(Postorder Traversal)的访问顺序:后序遍历左子树à后序遍历右子树à根节点
后序遍历的代码实现可以根据先序遍历的代码进行转换即可,代码如下:
// 后序遍历
public static void postorderTraversal(Node root) {
if (root == null) {
return;
}
postorderTraversal(root.left);
postorderTraversal(root.right);
System.out.print(root.val + " ");
}
层序遍历(Level Order Traversal)的访问顺序:从根节点开始,一层一层向下访问。
首先判断根节点是否为空,然后初始化队列queue,并将根节点root加入到队列中去,当队列不为空时,队列中弹出节点node,加入到结果中去,如果左子树非空,左子树加入到队列中去,如果右子树非空,右子树加入到队列中去。
// 层次遍历
public static void levelorderTraversal(Node root) {
if (root == null) {
return;
}
Queue<Node> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
Node node = queue.poll();
System.out.print(node.val + " ");
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
最后在main函数中测试代码,初始化数据,代码如下:
Node root = new Node("A");
root.left = new Node("B");
root.right = new Node("C");
root.left.left = new Node("D");
root.left.right = new Node("F");
root.left.right.left = new Node("E");
root.right.left = new Node("G");
root.right.left.right = new Node("H");
root.right.right = new Node("I");
System.out.print("Inorder: ");
inorderTraversal(root);
System.out.println();
System.out.print("Preorder: ");
preorderTraversal(root);
System.out.println();
System.out.print("Postorder: ");
postorderTraversal(root);
System.out.println();
System.out.print("Levelorder: ");
levelorderTraversal(root);
System.out.println();
完整的代码如下所示:
import java.util.LinkedList;
import java.util.Queue;
class Node {
String val;
Node left;
Node right;
Node(String val) {
this.val = val;
}
}
public class BinaryTreeTraversal {
// 中序遍历
public static void inorderTraversal(Node root) {
if (root == null) {
return;
}
inorderTraversal(root.left);
System.out.print(root.val + " ");
inorderTraversal(root.right);
}
// 前序遍历
public static void preorderTraversal(Node root) {
if (root == null) {
return;
}
System.out.print(root.val + " ");
preorderTraversal(root.left);
preorderTraversal(root.right);
}
// 后序遍历
public static void postorderTraversal(Node root) {
if (root == null) {
return;
}
postorderTraversal(root.left);
postorderTraversal(root.right);
System.out.print(root.val + " ");
}
// 层次遍历
public static void levelorderTraversal(Node root) {
if (root == null) {
return;
}
Queue<Node> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
Node node = queue.poll();
System.out.print(node.val + " ");
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
}
public static void main(String[] args) {
Node root = new Node("A");
root.left = new Node("B");
root.right = new Node("C");
root.left.left = new Node("D");
root.left.right = new Node("F");
root.left.right.left = new Node("E");
root.right.left = new Node("G");
root.right.left.right = new Node("H");
root.right.right = new Node("I");
System.out.print("Inorder: ");
inorderTraversal(root);
System.out.println();
System.out.print("Preorder: ");
preorderTraversal(root);
System.out.println();
System.out.print("Postorder: ");
postorderTraversal(root);
System.out.println();
System.out.print("Levelorder: ");
levelorderTraversal(root);
System.out.println();
}
}
运行的效果图: