早先编过一个左旋的,改一下给你了——
创新互联公司长期为上千客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为师宗企业提供专业的网站设计、成都做网站,师宗网站改版等技术服务。拥有10多年丰富建站经验和众多成功案例,为您定制开发。
代码文本:
#include "stdio.h"
int fun(int x, int y, int lt, int n){
if(!x)
return lt+y;
else if(!y)
return lt+4*(n-1)-x;
else if(y==n-1)
return lt+n+x-1;
else if(x==n-1)
return lt+3*(n-1)-y;
else
return fun(x-1,y-1,lt+4*(n-1),n-2);
}
int main(int argc,char *argv[]){
int n, i, j;
printf("Please enter n(int 0n10)...\nn=");
if(scanf("%d", n)==1 n0 n10){
for(i=0;in;i++){
for(j=0;jn;++j)
printf("%2d ", fun(i,j,1,n));
putchar('\n');
}
}
else
printf("Input error, exit...\n");
return 0;
}
嗯,你可能理解错了,不是最终最终执行08条,而是在任何一次的递归调用结束之后都有可能从这个地方返回。我来讲解一下吧,如果这棵树非空,而且存在左子树,那么的确会在第5行一直走到最左下的叶子,在到达最左下的叶子之后的那一次递归(此时root-lchild==null,调用heightbt(root-lchild)),root==null,那么返回0,此时递归返回一层,也就是返回到最左下的叶子处,此时LH=0,继续执行heightbt(root-rchild),那么类似刚才的过程继续检查右子树。其实递归的话没有必要去追究每一步都是怎么执行的,而是要从整体上去把握他的思想。写递归的时候也是这样,不太可能去细究每一步应该怎么实现,而要认为只要条件设置正确,那么一定会正确的实现递归。另外,楼主要注意一下编程风格。
#include "stdio.h"
void intrev(int n){
if(n){
printf("%d",n%10);
intrev(n/10);
}
}
int main(int argc,char *argv[]){
int x;
printf("Please enter a positive integer...\n");
if(scanf("%d",x)!=1 || x1){
printf("Input error, exit...\n");
return 0;
}
intrev(x);
printf("\n");
return 0;
}
运行样例:
就是一个栈的效果,先进后出
如输入abc\n
首先进入第一层reverse:c='a', c!='\n'
----进入第二层reverse:c='b', c!='\n'
--------进入第三层reverse:c='c', c!='\n'
------------进入第四层reverse:c='\n',
------------结束第四层reverse,回到第三层
--------c!='\n',输出c,结束第三层reverse,回到第二层
----c!='\n',输出b,结束第二层reverse,回到第一层
c!='\n',输出a,结束第一层reverse,程序结束