前几篇文章我们分析了几种二叉树的原理和实现,今天我们分析其遍历方式,前序遍历、中序遍历、后续遍历;我们以普通的二叉树为例;
1、实现二叉树的代码:
public class TestTwoTree {
//定义Node节点
public static class Node{
int data;
Node leftChild;
Node rightChild;
int height;
public Node(int data) {
this.data = data;
}
}
public static void main(String[] arges){
Node root = null;
root = insertData(root,30);
root = insertData(root,20);
root = insertData(root,40);
root = insertData(root,10);
root = insertData(root,25);
}
/**
* 添加完数据后的示意图
* 30
* / \
* 20 40
* / \
* 10 25
*
*/
private static Node insertData(Node root, int data) {
if(root == null){//首次添加数据
root = new Node(data);
return root;
}
if(data <= root.data){
root.leftChild = insertData(root.leftChild,data);//数据放到左节点
}else {
root.rightChild = insertData(root.rightChild,data);//数据放到右节点
}
return root;
}
}
2、上面生成了一个普通的二叉树,采用前序遍历方式输出:
//main方法里的测试代码
System.out.println("前序遍历:");
printFirstTree(root);
/**
* 前序遍历 根左右的输出原则,即先输出根节点数据,再输出左节点数据,最后输出右节点数据
* 执行结果: 30 20 10 25 40
* @param root
*/
private static void printFirstTree(Node root) {
if(root == null){
return;
}else {
System.out.print(root.data+" ");//输出节点数据
printFirstTree(root.leftChild);//输出左节点数据
printFirstTree(root.rightChild);//输出右节点数据
}
}
执行结果:
这里新手有时候看不懂这个代码,这里分析一次,首先这是循环递归调用自己,调用的思路符合JVM中栈的特性:后进先出!
方法里不断调用不断的返回,这里我Debug 调用详细演示一次(后面两种遍历方式,原理相同,不在这样演示了):
1)刚进入此方法时,即首次循环调用时:
2)第二次调用:
第三次:
3)此时其左节点为空(目前还没有经过 printFirstTree(root.rightChild); 方法),下次循环会走到 return;因为 节点 10 的左节点为空; 即第四次循环:
下一步时返回到 printFirstTree(root.rightChild);方法,如图:
4)第五次循环:节点10 处,右节点为空,也会走到return;如图:
返回:然后开始首次出栈,后进先出原则:
出栈后开始下一次循环:并且数据到20处的节点。
5)第六次循环,显然20 有右节点,即右节点不为空,而是25,如图:
即下一步会打印25
6)第七次循环左节点为空返回,第八次循环右节点为空返回:
返回到这里:
第八次循环:
再次出栈:
然后到这里:数据为30的节点
7)开始了第九次循环:30的右节点是40,开始往下走,如图
开始打印 40数据:
8)然后继续循环,其左右节点均为空,循环后两次之后就完全出栈,执行完全结束。
3、中序遍历方式:特点是数据从小到大输出!
//main方法里的测试代码
System.out.println("中序遍历:");
printMidTree(root);
/**
* 中序遍历 左根右的输出原则,即先输出左节点数据,再输出根节点数据,最后输出右节点数据
* 执行结果 10 20 25 30 40
* @param root
*/
private static void printMidTree(Node root) {
if(root == null){
return;
}else {
printMidTree(root.leftChild);//输出左节点数据
System.out.print(root.data + " ");//输出节点数据
printMidTree(root.rightChild);//输出右节点数据
}
}
执行结果:
4、后序遍历方式
//main方法里的测试代码
System.out.println("后序遍历:");
printEndTree(root);
/**
* 后序遍历 左右根的输出原则,即先输出左节点数据,再输出右节点数据 ,最后输出根节点数据
* 执行结果: 10 25 20 40 30
* @param root
*/
private static void printEndTree(Node root) {
if( root == null){
return;
}else {
printEndTree(root.leftChild);//输出左节点数据
printEndTree(root.rightChild);//输出右节点数据
System.out.print(root.data + " ");//输出节点数据
}
}
执行结果:
到此二叉树(平衡二叉树等也适用这几种遍历方法)的遍历方式分析完毕,下篇分析B+数的原理及实现,敬请期待!