前序遍历
先访问根节点,然后前序遍历左子树,再前序遍历右子树。
如图遍历的顺序为:ABDGHCEIF
中序遍历
先从根节点开始(不是先访问根节点),中序遍历根节点的左子树,然后访问根节点,最后中序遍历右子树。
如图遍历的顺序为:CDHBAEICF
后序遍历
从左到右按照先叶子后节点的方式遍历访问左右子树,最后访问根节点。
如图遍历的顺序为:GHDBIEFCA
层序遍历
从树的第一层(根节点)开始,从上到下,从左到右访问。
如图遍历的顺序为:ABCDEFGHI
Java代码实现
前序
/**
* Description: 前序遍历.
* 根节点 -> 左子树 -> 右子
* @author : ys.
**/
private void dlr(List<String> values, TreeNode node) {
values.add(node.getValue());
if (node.getLeft() != null) {
dlr(values, node.getLeft());
}
if (node.getRight() != null) {
dlr(values, node.getRight());
}
}
中序
/**
* Description: 中序遍历.
* 左子树 -> 根节点 -> 右子树
* @author : ys.
**/
private void ldr(List<String> values, TreeNode node) {
if (node.getLeft() != null) {
ldr(values, node.getLeft());
}
values.add(node.getValue());
if (node.getRight() != null) {
ldr(values, node.getRight());
}
}
后序
/**
* Description: 后序遍历.
* 左子树 -> 根节点 -> 右子树
* @author : ys.
**/
private void lrd(List<String> values, TreeNode node) {
if (node.getLeft() != null) {
lrd(values, node.getLeft());
}
if (node.getRight() != null) {
lrd(values, node.getRight());
}
values.add(node.getValue());
}
层序
/**
* Description: 层序遍历.
* 上 -> 下 ; 左 -> 右
* @author : ys.
**/
public void stair(List<String> values, TreeNode node) {
//队列先进先出,取值时先取左叶子再取右叶子即可保证顺序
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(node);
while (!queue.isEmpty()) {
TreeNode treeNode = queue.poll();
values.add(treeNode.getValue());
if (treeNode.getLeft() != null) {
queue.offer(treeNode.getLeft());
}
if (treeNode.getRight() != null) {
queue.offer(treeNode.getRight());
}
}
}
测试代码
public static void main(String[] args) {
Traverse traverse = new Traverse();
List<String> list1 = new ArrayList<>();
traverse.dlr(list1, TreeNode.getModel());
System.out.println("前序遍历:");
for (String str : list1) {
System.out.print(str + " ");
}
List<String> list2 = new ArrayList<>();
traverse.ldr(list2, TreeNode.getModel());
System.out.println();
System.out.println("--------------------");
System.out.println("中序遍历:");
for (String str : list2) {
System.out.print(str + " ");
}
List<String> list3 = new ArrayList<>();
traverse.lrd(list3, TreeNode.getModel());
System.out.println();
System.out.println("--------------------");
System.out.println("后序遍历:");
for (String str : list3) {
System.out.print(str + " ");
}
List<String> list4 = new ArrayList<>();
traverse.stair(list4, TreeNode.getModel());
System.out.println();
System.out.println("--------------------");
System.out.println("层序遍历:");
for (String str : list4) {
System.out.print(str + " ");
}
}
控制台输出结果
前序遍历:
A B D G H C E I F
--------------------
中序遍历:
G D H B A E I C F
--------------------
后序遍历:
G H D B I E F C A
--------------------
层序遍历:
A B C D E F G H I
TreeNode类,省略构造函数与get( )/set( )方法
/**
* Description: .
* @author : ys.
*/
public class TreeNode {
private String value;
private TreeNode left;
private TreeNode right;
public static TreeNode getModel() {
TreeNode nodeI = new TreeNode("I", null, null);
TreeNode nodeH = new TreeNode("H", null, null);
TreeNode nodeG = new TreeNode("G", null, null);
TreeNode nodeF = new TreeNode("F", null, null);
TreeNode nodeE = new TreeNode("E", null, nodeI);
TreeNode nodeD = new TreeNode("D", nodeG, nodeH);
TreeNode nodeC = new TreeNode("C", nodeE, nodeF);
TreeNode nodeB = new TreeNode("B", nodeD, null);
return new TreeNode("A", nodeB, nodeC);
}
}