从二叉树的生成中了解递归
在学习递归之前呢,我们先了解一种用图表示函数调用的方式。
比如:
public class Test{
public static void main(String args[]){
function1();
function2()
}
public static void function1(){}
public static void function2(){}
}
用图表示的话就是:
这张图表示main()函数调用了funciton1()和funtion2()两个函数,并且调用顺序是从左到右。
好,有了图表示函数调用之后,说明递归就比较简单了。
什么是递归?简单的来说就是自己调用自己。我们用一个最简单的例子–二叉树的生成 来说明递归的过程。
//定义一个叫做Node的节点,作为一个数据结构
public class Node{
public int data; //节点上的数据
public Node left; //左节点
public Node right; //右节点
}
public class Test{
public static void main(String args[]){
Node root = creatTree(3);
}
/* @param level:表示生成的二叉树有多少层
@return :返回的是二叉树的根节点
*/
public static Node creatTree(int level){
Node root = new Node(); //创建一棵树的根节点
creatNode(root,level); //根据根节点和层数生成一棵树
return root; //将树的根节点返回
}
public static void creatNode(Node parent,int level){
//递归终止条件
if(level == 0) return;
//每一层递归要做的事情
parent.left = new Node();
parent.right = new Node();
level--;
//递归
creatNode(parent.left,level);
creatNode(parent.right,level);
}
}
这份代码比较规范,核心是creatNode()这个函数,只有这个函数中用到了递归,看起来这个函数比较美观,理解起来却让人头皮发麻,好,那我们用图来理解一下。
上面的序号代表函数的执行顺序,自己想想为什么是这个顺序,这个过程我不能帮你代替,相信聪明的你一定想出来,静下心来,不要浮躁,好好想想。。
如果想明白了的话,接着往下。
然后我们来分析一下creatNode()这个函数
这个函数由三部分组成:
- 递归终止条件
if(level==0)return;
- 每一次递归要做的事情
parent.left = new Node();
parent.right = new Node();
level--;
- 递归
creatNode(parent.left,level);
creatNode(parent.right,level);
现在我们回过头来想想我们是怎么构造creatNode()这个函数的。
回想一下树的生成过程:对于每一个节点,都生成它的左节点和右节点,当生成3层之后就结束递归。
所以:
终止条件: level==0
每次递归要做的事情:
parent.left = new Node();//生成左节点
parent.right = new Node();//生成右节点
level --;
递归:
creatNode(root.left);
creatNode(root.right);
这是我第一次写博客,感觉很多东西想表达却表达不出,以后会有提高,希望对诸位有所帮助。