树的三种遍历顺序
先序遍历
先序遍历的顺序就是先依次访问每颗子树的根节点,然后再依次访问左子树和右子树,即根左右。以下图为例,先序遍历的输出次序就是 A,B,D,C,E,F
中序遍历
中序遍历是先依次访问每颗子树的左孩子节点,然后访问子树的根节点,最后访问子树的右孩子节点,即左根右。以下图为例,中序遍历的输出次序就是 D,B,A,E,F,C
后序遍历
后序遍历是先依次访问每颗子树的左孩子节点,然后访问子树的右孩子节点,最后访问根节点,即左右根。以下图为例,后续遍历的输出次序就是D,B,F,E,C,A
代码实现
节点类
在这里,我们使用链式存储来实现二叉树,二叉树中的节点包含 数据域
和 指针域
,数据域用于存放数据,指针域用于指向当前节点的左右孩子节点。Java代码如下:
//二叉树中的节点数据
public class TreeNode {
private Object data; //数据域
private TreeNode lChild; //左孩子
private TreeNode rChild; //有孩子
public TreeNode(Object data) {
this.data = data;
}
public TreeNode(){}
public void setLChild(TreeNode lChild) {
this.lChild = lChild;
}
public void setRChild(TreeNode rChild) {
this.rChild = rChild;
}
public void setData(Object data) {
this.data = data;
}
public TreeNode getLChild() {
return this.lChild;
}
public TreeNode getRChild() {
return this.rChild;
}
public Object getData() {
return this.data;
}
}
二叉树的构建和遍历
定义一个新的类 BinaryTree
,用来表示一颗二叉树,并在该类中编写关于二叉树的操作方法。
//一个BinaryTree对象就为一棵二叉树
public class BinaryTree {
//根节点
public TreeNode root = new TreeNode();
//接收用户输入
Scanner sc = new Scanner(System.in);
//构建一个二叉树
/*
实现思路:
1.接收用户输入,只要其不为#,就将其赋值给当前节点,并通过递归生成其左子树和右子树
2.如果用户输入#号,就代表当前节点为空,回溯到上一层递归去构建左子树/右子树
*/
public TreeNode build(TreeNode treeNode){
Object data = sc.next();
TreeNode newTreeNode = null;
//如果输入#,表示当前节点为空,开始回溯到上一级调用
if(data.equals("#")) {
treeNode = null;
} else {
//如果输入的不是#,就通过遍历构建二叉树的左子树
//并且把输入的值设置到当前节点
treeNode.setData(data);
newTreeNode = new TreeNode();
treeNode.setLChild(build(newTreeNode));
//构建二叉树的右子树
newTreeNode = new TreeNode();
treeNode.setRChild(build(newTreeNode));
}
//返回当前节点
return treeNode;
}
//先序遍历
public void preOrder(TreeNode treeNode) {
if(treeNode != null) {
System.out.print(treeNode.getData() + "\t"); //访问根节点
preOrder(treeNode.getLChild()); //递归遍历左子树
preOrder(treeNode.getRChild()); //递归遍历右子树
}
}
//中序遍历
public void midOrder(TreeNode treeNode) {
if(treeNode != null) {
midOrder(treeNode.getLChild());
System.out.print(treeNode.getData() + "\t");
midOrder(treeNode.getRChild());
}
}
//后序遍历
public void postOrder(TreeNode treeNode) {
if(treeNode != null) {
postOrder(treeNode.getLChild());
postOrder(treeNode.getRChild());
System.out.print(treeNode.getData() + "\t");
}
}
}
测试
编写一个新的类,在主方法中测试
package cn.hypig.tree;
import java.util.*;
public class BinaryTreeDemo{
public static void main(String[] args) {
BinaryTree tree = new BinaryTree();
tree.build(tree.root);
System.out.println("----------先序遍历----------");
tree.preOrder(tree.root);
System.out.println("\n----------中序遍历----------");
tree.midOrder(tree.root);
System.out.println("\n----------后序遍历----------");
tree.postOrder(tree.root);
}
}
测试结果
输入:
输出