1
引言
这次来聊聊二叉树的递归排序。本文介绍前中后三种二叉树的递归写法。刚开始看递归代码的时候,很多时候都是"不看不会,一看就会,一写就废",主要还是对递归理解得不够清晰,这次就借二叉树的递归排序来好好梳理下这个知识点。
2
知识回顾
-
二叉树遍历的大前提是先左后右。
-
二叉树的前中后序遍历是对根节点而言的,比如中序遍历,那遍历顺序就是 左根右,后序遍历就是左右根.
-
递归是指在一个函数或者子程序的定义中直接或间接地调用自身的现象。也就是说,一个函数不仅仅执行某个特定任务,而且在执行过程中会根据需要调用自身来解决规模更小但结构相同的问题。
3
解决思路
运用递归写法解决二叉树排序的的步骤
确定递归方法的参数和返回值
确定出口,即终止条件
确定单层递归的逻辑
4
具体实现
定义二叉树
public class BinaryTree {
public int value;
public BinaryTree left;
public BinaryTree right;
public BinaryTree(int value){
this.value=value;
this.left=null;
this.right=null;
}
}
二叉树的递归序
public class BinaryTreeErgodic {
public static void main(String[] args) {
BinaryTree head = new BinaryTree(1);
head.left = new BinaryTree(2);
head.right = new BinaryTree(3);
head.left.left = new BinaryTree(4);
head.left.right = new BinaryTree(5);
head.right.left = new BinaryTree(6);
head.right.right = new BinaryTree(7);
recursionSort(head);
}
// 1.确定递归的形参与返回值
// 形参要传入二叉树的根节点,之后便不需要其他的值了,只需打印结点的数据即可,所以是void
public static void recursionSort(BinaryTree head) {
// 2.终止条件
// 当递归的节点为空时,递归结束,这就是出口
if (head == null) {
return;
}
// 3.写单层递归的逻辑
// 这里的逻辑是打印递归序
System.out.println(head.value);
recursionSort(head.left);
System.out.println(head.value);
recursionSort(head.right);
System.out.println(head.value);
}
}
最终输出的递归序列为:
1,2,4,4,4,2,5,5,5,2,1,3,6,6,6,3,7,7,7,3,1
为什么要说递归序呢,因为前中后序遍历就是根据递归序来的。递归序中每一个数字打印三次,那前序遍历,就是打印该数字第一次出现的结果,之后出现的不打印。同理,中序遍历就是打印第二次出现的结果,第一次和第三次出现的不打印。
同学们可以跟着代码去思考思考。
前序遍历
public class BinaryTreeErgodic {
public static void main(String[] args) {
BinaryTree head = new BinaryTree(1);
head.left = new BinaryTree(2);
head.right = new BinaryTree(3);
head.left.left = new BinaryTree(4);
head.left.right = new BinaryTree(5);
head.right.left = new BinaryTree(6);
head.right.right = new BinaryTree(7);
preOrderRecur(head);
}
public static void preOrderRecur(BinaryTree head) {
if (head == null) {
return;
}
System.out.print(head.value + " ");
preOrderRecur(head.left);
preOrderRecur(head.right);
}
}
输出的结果为:1 2 4 5 3 6 7;写出递归序,只取第一次出现的数字。
中序遍历
public static void inOrderRecur(BinaryTree head){
if(head==null){
return;
}
inOrderRecur(head.left);
System.out.print (head.value+" ");
inOrderRecur(head.right);
}
输出的结果为:4 2 5 1 6 3 7 ;写出递归序,只取第二次出现的数字。
后序遍历
public static void posOrderRecur(BinaryTree head){
if(head==null){
return;
}
posOrderRecur(head.left);
posOrderRecur(head.right);
System.out.print(head.value+" ");
}
输出的结果为:4 5 2 6 7 3 1 ;写出递归序,只取第三次出现的数字。
5
笔记扩展
什么是满二叉树与完全二叉树
满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点二叉树。
完全二叉树:所有的叶节点都出现在最底层或者是倒数第二层,而且最底层的叶节点集中在树的左部。
二者关系:满二叉树是完全二叉树的一个特例,它的所有非叶子节点都有两个子节点。
感觉不错的话,就请点赞支持一下吧!
微信公众号|大数据进阶小铺