Questions
1、什么是递归?
2、树为什么要分个二叉树出来?
递归与尾递归
递归的本质是函数的自我调用,函数应满足的条件递归必须也满足。
递,将函数随着一层层调用压入栈中。归,随着函数运行结束(return,函数体结束),又一层层出栈。这就是递归。
递归用于可将大问题有规律地分解成一个个小问题,方便代码书写。书写递归代码时在满足函数要求时,还需要满足两个条件:递归出口,递归体(规律,逻辑)。
优点:方便写代码。
缺点:占用性能。
一种递归地优化为尾递归,写递归函数体时,调用自身时,调用的返回值直接被该函数返回,此时调用之后,在栈底的函数可被覆盖,无需等待“归”的过程。
例子
1、二叉树的递归查找
Node* Search(Node* node, int key)
{
Node* temp = NULL;
if (node->key == key)
temp = node;
else if (node->child != NULL)
{
temp = Search(node->child, key);
if (temp == NULL&&node->brother!=NULL)
temp = Search(node->brother, key);
}
else if (node->brother != NULL)
{
temp = Search(node->brother, key);
}
return temp;
}
2、简单递归,尾递归
//累加
int add(int x)
{
int result = 0;
if (x > 1)
result = add(x - 1) + x;
else
result = x;
return result;
}
//累加-尾递归
int addPlus(int x, int sum = 0)
{
if (x == 1)
return sum + x;
else
return addPlus(x - 1, sum + x);
}
//斐波那契数列
int feibonaqie(int x)
{
if (x < 2)
return x;
else
{
return feibonaqie(x - 2) + feibonaqie(x - 1);
}
}
二叉树
每个节点最多只有两个孩子。
特殊:
1、完全二叉树:从左到右,从上到下构建二叉树。
2、满二叉树:叶子节点在同一层,没有度为1的节点。
斐波那契数列的递归调用,也可以用二叉树解释。
二叉树的性质:
My Existing Answer
1.函数的自我调用
2.该结构在某个领域内频繁使用,对于设计某些程序而言更加便利实用。