在这之前我不少用递归函数,但一直没有真正弄明白递归函数的返回值的原理,为了更好的说明问题我写一个平衡二叉树算法利用递归算法查找值的源码如下:
package com.cph.interviwe;
public class Node {
public int value;
public Node left;
public Node rigth;
public Node(int value){
this.value=value;
}
public Node( ){
}
public boolean store(int value){
if(this.value>value){
if(left==null){
left=new Node();
left.value=value;
}else {
left.store(value);
}
}
if(this.value<value){
if(rigth==null){
rigth=new Node();
rigth.value=value;
}else {
rigth.store(value);
}
}
if(this.value==value){
return false;
}else {
return true;
}
}
public boolean find(int value){
boolean b=true;
if(this.value>value){
if(left==null){
b=false;
}else {
left.find(value);
}
}else if(this.value<value){
if(rigth==null){
b=false;
}else {
rigth.find(value);
}
}
return b;
}
public static void main(String[] args) {
Node node=new Node(7);
node.store(4);
node.store(6);
node.store(8);
System.out.println(node.find(9));
}
}
这个是二叉树中的存储数据和查找数据的方法,如果没有多加注意,可能你会觉得控制台那输出的是false,因为创建的二叉树中并没有存在9数据,但事实上控制台上输出的是true。
我们现在修改一下main方法,如下(注释了一行代码)
public static void main(String[] args) {
Node node=new Node(7);
node.store(4);
node.store(6);
System.out.println(node.find(9));
}
仅仅注释了一行代码,控制台那却输出是false。
如果你感到很疑惑,说明你对递归函数的返回值的理解不够透彻。我们分析一下代码,在find()方法中如果我们在二叉树中该节点找到输入的数据函数返回是true,否则返回的是false。这句话是没有问题,注意我说的是二叉树中的该节点。那为什么该节点返回来的值在后面就改变了呢?其实该函数的b并没有改变,只是在System.out.println(node.find(9))中返回来的并不是该节点的b,而是递归调用的最高层的那个b。
说了上面那个也许你开始有点懵懂了,对应我们上面那两个实例分析:
①第一个为什么输入的是true,因为当程序检查根结点的值为7,而输入的是9,比7大。所以来到7的有节点,有节点的值为8,还是小于9,继续找8的右节点,8的有节点为空。所以返回false,注意该返回后,是来到根结点7的那个find方法,而7中的find返回来的是7中的b,而7中的b为true,所以System.out输出来的是true.
②第二个当接受的数据为9,比7大,所以查找7的右节点,而7的右节点为空,b为false。而该find函数外面没有再嵌套find了,所以输出来的是false。
如果想使结果一层一层传上来,我们该怎么做?其实很简单,就是在递归调用前面加上return即可。
public boolean find(int value){
boolean b=true;
if(this.value>value){
if(left==null){
b=false;
}else {
return left.find(value);
}
}else if(this.value<value){
if(rigth==null){
b=false;
}else {
return rigth.find(value);
}
}
return b;
}