编程1 实现二叉树每一个节点的左右子节点相互调换?
参考程序:
Status BiTree_Revolute(BiTree T)//左右子树交换
{
if(!T) return OK;
BitNode *temp;
if(T->lchild!=NULL&&T->rchild!=NULL)
{
temp=T->lchild;
T->lchild=T->rchild;
T->rchild=temp;
}
BiTree_Revolute(T->lchild);
BiTree_Revolute(T->rchild);
return OK;
}
编程2 一个台阶一共n级,一次可跳1级,也可跳2级,编程实现计算共有几种方法?并分析算法的时间复杂度
思路:
首先我们考虑最简单的情况:如果只有1 级台阶,那显然只有一种跳法,如果有2 级台阶,那就有两种跳的方法了:一种是分两次跳,每次跳1 级;另外一种就是一次跳2 级。
现在我们再来讨论一般情况:我们把n 级台阶时的跳法看成是n 的函数,记为f(n)。当n>2 时,第一次跳的时候就有两种不同的选择:一是第一次只跳1 级,此时跳法数目等于后面剩下的n-1 级台阶的跳法数目,即为f(n-1);另外一种选择是第一次跳2 级,此时跳法数目等于后面剩下的n-2 级台阶的跳法数目,即为f(n-2)。
因此n 级台阶时的不同跳法的总数f(n) = f(n-1) + f(n-2)。
我们把上面的分析用一个公式总结如下:
/ 1 (n=1)
f(n) = 2 (n=2)
\ f(n-1) + (f-2) (n>2)
分析到这里,相信很多人都能看出这就是我们熟悉的Fibonacci 序列。
参考代码: