二叉树 先序 中序 后序遍历的实现和原理
因为这个二叉树也算是一个比较基础的数据结构了,具体是什么我就不过多赘述了,先序 中序 和 后序 是什么 大家可以看下面这个文章讲的很清晰明了,我们今天主要研究代码实现和原因。
链接:二叉树
首先看一下普通的通过 递归遍历二叉树。
构造二叉树
/**
* @author 冀十三 (易)
* @date 2022/3/6 1:10
*/
public class BinaryTree {
//值或者数据
int value;
//左子节点
BinaryTree leftChild;
//右子节点
BinaryTree rightChild;
// 带参构造
public BinaryTree(int value) {
this.value = value;
}
public static void main(String[] args) {
int[] nums = new int[]{5,2,7,9,4,3,6};
//创建 一颗 二叉树;
BinaryTree tree = new BinaryTree(nums[0]);
tree.leftChild = new BinaryTree(nums[1]);
tree.rightChild = new BinaryTree(nums[2]);
BinaryTree left = tree.leftChild;
BinaryTree right = tree.rightChild;
left.leftChild = new BinaryTree(nums[3]);
left.rightChild = new BinaryTree(nums[4]);
right.leftChild = new BinaryTree(nums[5]);
right.rightChild = new BinaryTree(nums[6]);
}
}
这棵树建好应该是这样的:
// 递归遍历 二叉树
public static void recursiveTraversal(BinaryTree node){
if(node==null){
return;
}
System.out.print(node.value+"\t");
recursiveTraversal(node.leftChild);
System.out.print(node.value+"\t");
recursiveTraversal(node.rightChild);
System.out.print(node.value+"\t");
}
以上代码如果去掉三句 输出语句,那么他就是一个简单的遍历,但是有这三条输出语句之后,就会发现每个节点都会打印三次。
打印结果是:
每个数字都经过了三遍。因为每次到这个节点之后还会 查看他的左右孩子直到都为null。
那么根据先序 中序 后序的规则总结发现,如果每次只打印第一次到达这个节点的结果 就是 先序遍历。代码如下
//先序遍历
public static void firstTraversal(BinaryTree node){
if(node==null){
return;
}
//这里 是每次 第一次到达这个节点。
System.out.print(node.value+"\t");
firstTraversal(node.leftChild);
firstTraversal(node.rightChild);
}
打印结果如下
如果每次只打印第二次到达这个节点的结果 就是中序遍历。
//中序遍历
public static void midTraversal(BinaryTree node){
if(node==null){
return;
}
midTraversal(node.leftChild);
//这里 是每次 第二次到达这个节点。
System.out.print(node.value+"\t");
midTraversal(node.rightChild);
}
打印结果如下
如果每次只打印第三次次到达这个节点的结果 就是中序遍历。
//后序遍历
public static void endTraversal(BinaryTree node){
if(node==null){
return;
}
endTraversal(node.leftChild);
endTraversal(node.rightChild);
//这里 是每个节点第三次次到达这个节点。
System.out.print(node.value+"\t");
}
打印结果如下:
完整代码:
/**
* @author 冀十三 (易)
* @date 2022/3/6 1:10
*/
public class BinaryTree {
//值或者数据
int value;
//左子节点
BinaryTree leftChild;
//右子节点
BinaryTree rightChild;
// 带参构造
public BinaryTree(int value) {
this.value = value;
}
public static void main(String[] args) {
int[] nums = new int[]{5,2,7,9,4,3,6};
//创建 一颗 二叉树;
BinaryTree tree = new BinaryTree(nums[0]);
tree.leftChild = new BinaryTree(nums[1]);
tree.rightChild = new BinaryTree(nums[2]);
BinaryTree left = tree.leftChild;
BinaryTree right = tree.rightChild;
left.leftChild = new BinaryTree(nums[3]);
left.rightChild = new BinaryTree(nums[4]);
right.leftChild = new BinaryTree(nums[5]);
right.rightChild = new BinaryTree(nums[6]);
System.out.println("递归过程");
recursiveTraversal(tree);
System.out.println();
System.out.println("先序遍历");
firstTraversal(tree);
System.out.println();
System.out.println("中序遍历");
midTraversal(tree);
System.out.println();
System.out.println("后序遍历");
endTraversal(tree);
}
// 递归遍历 二叉树
public static void recursiveTraversal(BinaryTree node){
if(node==null){
return;
}
System.out.print(node.value+"\t");
recursiveTraversal(node.leftChild);
System.out.print(node.value+"\t");
recursiveTraversal(node.rightChild);
System.out.print(node.value+"\t");
}
//先序遍历
public static void firstTraversal(BinaryTree node){
if(node==null){
return;
}
//这里 是每次 第一次到达这个节点。
System.out.print(node.value+"\t");
firstTraversal(node.leftChild);
firstTraversal(node.rightChild);
}
//中序遍历
public static void midTraversal(BinaryTree node){
if(node==null){
return;
}
midTraversal(node.leftChild);
//这里 是每次 第二次到达这个节点。
System.out.print(node.value+"\t");
midTraversal(node.rightChild);
}
//后序遍历
public static void endTraversal(BinaryTree node){
if(node==null){
return;
}
endTraversal(node.leftChild);
endTraversal(node.rightChild);
//这里 是每个节点第三次次到达这个节点。
System.out.print(node.value+"\t");
}
}