十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
exit()是退出整个程序,函数后面的任何代码都不会被执行.
成都创新互联主要从事网站制作、做网站、网页设计、企业做网站、公司建网站等业务。立足成都服务通许,十多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:13518219792
从递归函数随时退出,可以直接返回不再调用自身,或者在返回时设置一个返回值告诉上一个函数不用再调用这个函数了.
至于用GOTO语句可能不行吧,GOTO语句好象只能在函数内使用.
直接跳出应该不可以,可以加一个short
bl;变量,标识是不是要退出。
递归创建二叉树的输入是有讲究的,可参考:网页链接中最后的输入示例:如果你用#作为结束,则对应输入:1 2 4 # 6 ###3 #5 #7 #8 ##
再给个递归创建二叉树的例子:
#include stdio.h
#include stdlib.h
typedef struct Tree {
int Val;
struct Tree* left;
struct Tree* right;
}Tree;
Tree * CreateBiTree(void)
{
Tree * T;
int val;
scanf("%d", val);
if(val == 0)
T = NULL;
else
{
T = (Tree *)malloc(sizeof(Tree));
T - Val = val;
T - left = CreateBiTree();
T - right = CreateBiTree();
}
return T;
}
void Print(Tree* root)
{
if (root != NULL)
{
Print(root-left);
printf("%d ", root-Val);
Print(root-right);
}
}
int main()
{
Tree* root = CreateBiTree();
Print(root);
return 0;
}
以上面的输入例子1 2 4 # 6 ###3 #5 #7 #8 ##为例,对应的输入为:1 2 3 0 6 0 0 0 3 0 5 0 7 0 8 0 0
运行结果:
当然也可以这样:
#include stdio.h
#include stdlib.h
typedef struct Tree {
int Val;
struct Tree* left;
struct Tree* right;
}Tree;
void CreateBiTree(Tree**T)
{
int val;
scanf("%d", val);
if(val == 0)
*T = NULL;
else
{
*T = (Tree *)malloc(sizeof(Tree));
(*T)-Val = val;
CreateBiTree((*T)-left);
CreateBiTree((*T)-right);
}
}
void Print(Tree* root)
{
if (root != NULL)
{
Print(root-left);
printf("%d ", root-Val);
Print(root-right);
}
}
int main()
{
Tree* root;
CreateBiTree(root);
Print(root);
return 0;
}
这里的输入示例为:1 2 4 0 6 0 0 0 7 0 0 0
运行结果:
C++ 版:
#include iostream
using namespace std;
typedef struct Tree {
int Val;
struct Tree* left;
struct Tree* right;
}Tree;
void CreateBiTree(Tree* T)
{
int val;
cin val;
if(val == 0)
T = NULL;
else
{
T = new Tree;
T-Val = val;
CreateBiTree(T-left);
CreateBiTree(T-right);
}
}
void Print(Tree*root)
{
if (root != NULL)
{
Print(root-left);
cout root-Val ' ';
Print(root-right);
}
}
int main()
{
Tree* root;
CreateBiTree(root);
Print(root);
return 0;
}
看了一下你的递归部分的代码,是正确的,没问题。
这个是不可以的,除非强制退出整个程序的执行,比如使用exit(0);这样的语句。
C语言的函数调用是一层一层的,本层函数执行完会返回上一层函数执行,如果一个递归函数已经调用了10层了,不可能说支持退出这十层函数的执行,直接返回最上层的函数,这个是不现实的。
但是也可以使用其他方法,比如全局变量之类的,每个函数都去判断这个全局变量,这样只要不满足,一层一层的退出函数,也可以实现这个功能,代码举例如下:
int flag=0; //全局变量,判断递归函数是否退出。
void fun1() //递归函数实现
{
xxxx //其他语句
fun1(); //递归调用
if(flag==1) //判断是否退出
{
return;
}
xxxx //其他语句
if(xxxx) //需要退出递归函数的条件
{
flag=1; //设置标志
return; //退出,这样会一直退出所有递归函数
}
}
不会被执行.
从递归函数随时退出,可以直接返回不再调用自身,或者在返回时设置一个返回值告诉上一个函数不用再调用这个函数了.
至于用GOTO语句可能不行吧,GOTO语句好象只能在函数内使用.