05-二叉树的几种遍历方式(剑指Offer)
题目:二叉树的几种遍历方式
思路:可以采用按序遍历,或者采用层级遍历,按序分为前序,中序,后序,递归实现较为简单且一目了然,也可以采用循环实现
代码
- 二叉树类
class TreeNode {
Object data;
TreeNode parent;
TreeNode leftChild;
TreeNode rightChild;
TreeNode(Object data) {
this.data = data;
}
}
- 先序遍历(递归)
//先序遍历 根->左->右
public static void preOrderTraversal(TreeNode node) {
if (node==null) return;
System.out.print(node.data + " ");
if (node.leftChild!=null) preOrderTraversal(node.leftChild);
if (node.rightChild!=null) preOrderTraversal(node.rightChild);
}
- 中序遍历(递归)
//中序遍历 左->根->右
public static void inOrderTraversal(TreeNode node) {
if (node==null) return;
if (node.leftChild!=null) inOrderTraversal(node.leftChild);
System.out.print(node.data + " ");
if (node.rightChild!=null) inOrderTraversal(node.rightChild);
}
- 后序遍历(递归)
//后序遍历 左->右->中
public static void postOrderTraversal(TreeNode node) {
if (node==null) return;
if (node.leftChild!=null) postOrderTraversal(node.leftChild);
if (node.rightChild!=null) postOrderTraversal(node.rightChild);
System.out.print(node.data + " ");
}
- 层级遍历(队列)
//import java.util.LinkedList;
//层级遍历(使用队列)
public static void levelOrder(TreeNode node) {
if (node==null) return;
LinkedList<TreeNode> queue = new LinkedList<>();
queue.add(node);
TreeNode root = node;
while (!queue.isEmpty()) {
root = queue.pop();
System.out.print(root.data + " ");
if (root.leftChild!=null) queue.add(root.leftChild);
if (root.rightChild!=null) queue.add(root.rightChild);
}
}
- 测试用例
public static void main(String[] args) {
TreeNode tree = new TreeNode("A");
tree.leftChild =new TreeNode("B");
tree.rightChild =new TreeNode("C");
tree.leftChild.leftChild = new TreeNode("D");
tree.leftChild.rightChild = new TreeNode("F");
tree.leftChild.rightChild.leftChild = new TreeNode("E");
tree.rightChild.leftChild = new TreeNode("G");
tree.rightChild.leftChild.rightChild = new TreeNode("H");
tree.rightChild.rightChild = new TreeNode("I");
preOrderTraversal(tree);
System.out.println();
inOrderTraversal(tree);
System.out.println();
postOrderTraversal(tree);
System.out.println();
levelOrder(tree);
}
- 整体代码
import java.util.LinkedList;
/**
* @author 江湖人称白玉汤
* @program 剑指Offer
* @description 遍历二叉树的方式(层级遍历,前序,中序,后序)
* @create 2020-04-29 19:14
**/
public class PrintTree {
static class TreeNode {
Object data;
TreeNode parent;
TreeNode leftChild;
TreeNode rightChild;
TreeNode(Object data) {
this.data = data;
}
}
public static void main(String[] args) {
TreeNode tree = new TreeNode("A");
tree.leftChild =new TreeNode("B");
tree.rightChild =new TreeNode("C");
tree.leftChild.leftChild = new TreeNode("D");
tree.leftChild.rightChild = new TreeNode("F");
tree.leftChild.rightChild.leftChild = new TreeNode("E");
tree.rightChild.leftChild = new TreeNode("G");
tree.rightChild.leftChild.rightChild = new TreeNode("H");
tree.rightChild.rightChild = new TreeNode("I");
preOrderTraversal(tree);
System.out.println();
inOrderTraversal(tree);
System.out.println();
postOrderTraversal(tree);
System.out.println();
levelOrder(tree);
}
//先序遍历 根->左->右
public static void preOrderTraversal(TreeNode node) {
if (node==null) return;
System.out.print(node.data + " ");
if (node.leftChild!=null) preOrderTraversal(node.leftChild);
if (node.rightChild!=null) preOrderTraversal(node.rightChild);
}
//中序遍历 左->根->右
public static void inOrderTraversal(TreeNode node) {
if (node==null) return;
if (node.leftChild!=null) inOrderTraversal(node.leftChild);
System.out.print(node.data + " ");
if (node.rightChild!=null) inOrderTraversal(node.rightChild);
}
//后序遍历 左->右->中
public static void postOrderTraversal(TreeNode node) {
if (node==null) return;
if (node.leftChild!=null) postOrderTraversal(node.leftChild);
if (node.rightChild!=null) postOrderTraversal(node.rightChild);
System.out.print(node.data + " ");
}
//层级遍历(使用队列)
public static void levelOrder(TreeNode node) {
if (node==null) return;
LinkedList<TreeNode> queue = new LinkedList<>();
queue.add(node);
TreeNode root = node;
while (!queue.isEmpty()) {
root = queue.pop();
System.out.print(root.data + " ");
if (root.leftChild!=null) queue.add(root.leftChild);
if (root.rightChild!=null) queue.add(root.rightChild);
}
}
}