#include
成都創(chuàng)新互聯(lián)是少有的做網(wǎng)站、成都網(wǎng)站制作、營銷型企業(yè)網(wǎng)站、微信小程序、手機(jī)APP,開發(fā)、制作、設(shè)計(jì)、買鏈接、推廣優(yōu)化一站式服務(wù)網(wǎng)絡(luò)公司,從2013年開始,堅(jiān)持透明化,價(jià)格低,無套路經(jīng)營理念。讓網(wǎng)頁驚喜每一位訪客多年來深受用戶好評(píng)
#include
#include
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OVERFLOW -2
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define NULL 0
typedef int status;
typedef struct bitnode{ /*二叉樹的結(jié)點(diǎn)*/
char data;
struct bitnode *lchild,*rchild;
}bitnode,*bitree;
bitree t;
status createbitree(bitree *t) /*按先序次序輸入值建立二叉樹*/
{
char ch;
scanf("%c",ch);fflush(stdin);/*清除緩存區(qū)里的回車*/
if(ch=='*') *t=NULL;/*這里以星號(hào)作為結(jié)束標(biāo)志*/
else{
if(!(*t=(bitnode *)malloc(sizeof(bitnode))))exit(OVERFLOW);
(*t)-data=ch;
createbitree(((*t)-lchild));
createbitree(((*t)-rchild));
}
return OK;
}
status visit(char ch) /*對(duì)二叉樹每個(gè)結(jié)點(diǎn)元素的訪問操作*/
{
printf("%c",ch);
return OK;
} /*你這個(gè)visit函數(shù)好像沒什么作用?可以刪掉*/
status preordertraverse(bitree t) /*按先序訪問二叉樹*/
{
if(t)
{
printf("%c",t-data);
if(preordertraverse(t-lchild))
if(preordertraverse(t-rchild))return OK;
return ERROR;
}else return OK;
}
status jh(bitree t)
{
bitree x;
x=t-lchild;
t-lchild=t-rchild;
t-rchild=x;
return OK;
}
status exchange(bitree t) /*交換二叉樹中所有結(jié)點(diǎn)的左、右子樹*/
{
if(t)
{
jh(t);
if(jh(t-lchild)) /*這里是最重要的地方,你好像寫錯(cuò)了吧*/
if(jh(t-rchild))return OK;
return ERROR;
}else return OK;
}
void main()
{
printf("input to create binary tree:\n");
createbitree(t); /*按先序建立二叉樹*/
printf("create ok");/*提示createbitree函數(shù)沒有出問題*/
exchange(t);/*交換每個(gè)結(jié)點(diǎn)的左、右子樹*/
printf("\n");/*輸出一個(gè)換行*/
preordertraverse(t); /*按先序訪問修改后的二叉樹*/
getch();
}
我試過了,可以
答案是有的。
visit是自己寫的函數(shù)的指針。用來輸出你遍歷遇到的節(jié)點(diǎn)。
拓展:
C語言于1972年11月問世,1978年美國電話電報(bào)公司(ATT)貝爾實(shí)驗(yàn)室正式發(fā)布C語言,1983年由美國國家標(biāo)準(zhǔn)局(American National Standards Institute,簡(jiǎn)稱ANSI)開始制定C語言標(biāo)準(zhǔn),于1989年12月完成,并在1990年春天發(fā)布,稱之為ANSI C,有時(shí)也被稱為 C89 或 C90。
Visit在這里代表一個(gè)泛用的過程,也就是說對(duì)子樹進(jìn)行操作的過程。比如說這整個(gè)過程,如果是想要輸出對(duì)應(yīng)的節(jié)點(diǎn),那在里面可能就是
void Visit(TNode *node)
{
coutnode-value" ";
}
這樣的樣子;或者,比如要交換每個(gè)節(jié)點(diǎn)的左右子樹,那就是
void Visit(TNode *node){
TNode *temp = node-left;
node-left = node-right;
node-right = temp;
}
這樣的形式??傊褪侨魏慰梢詫?duì)單個(gè)節(jié)點(diǎn)進(jìn)行操作的代碼,根據(jù)需要而定。
二叉樹遍歷是不需要標(biāo)記的,因?yàn)闃湫谓Y(jié)構(gòu),每個(gè)節(jié)點(diǎn)不可能訪問超過一次(不存在環(huán)的緣故)。
這是復(fù)雜指針中最容易看懂的一種啦,搜索一下就會(huì)有人教你怎么看?;痉椒ㄊ窍扔液笞螅鲂±ㄌ?hào)回頭。習(xí)慣一下如下的讀法,看多了就習(xí)慣了。
int (* Visit)(int e)
從Visit向右看,遇到括號(hào),回頭向左,看到*,所以Visit是一個(gè)指針。繼續(xù)向左看,遇到括號(hào),回頭向右,看到(int e),這是一個(gè)參數(shù)為int的函數(shù)(為什么這樣看,本能了^_^)。讀到現(xiàn)在,已經(jīng)知道Visit是一個(gè)指向參數(shù)為int的函數(shù)的指針,但函數(shù)的返回類型還沒弄清楚。右邊已經(jīng)沒有了,回頭向左,看到int,這是函數(shù)的返回類型。
因此,Visit是一個(gè)函數(shù)指針,它指向的函數(shù)為int fun(int e)。注意,對(duì)Visit來說,它一點(diǎn)也不關(guān)心函數(shù)名,只要參數(shù)和返回值符合如上定義的,這個(gè)指針就可以調(diào)用。這個(gè)函數(shù)在哪呢,就是:
int Print_Element(int e)
{
printf("%d ", e);
return 0;
}
所以書上就說,Pre_Order_Traverse在先序遍歷時(shí),會(huì)調(diào)用這個(gè)函數(shù)來輸出節(jié)點(diǎn)。
定義Visit時(shí),只要把某個(gè)要調(diào)用的函數(shù)的名字改成(Visit*),其余不動(dòng),就可以正確寫出這個(gè)指針。以后學(xué)到動(dòng)態(tài)鏈接庫的時(shí)候,這種指針是很常見的,用多了就和吃飯一樣簡(jiǎn)單
應(yīng)該沒錯(cuò),就是想輸出結(jié)點(diǎn)數(shù)據(jù)唄,直接cout。Visit函數(shù)是對(duì)數(shù)據(jù)元素操作的具體函數(shù)。比如您要先序遍歷,肯定要輸出樹上每個(gè)節(jié)點(diǎn)的數(shù)值吧。輸出函數(shù)就可以寫在Visit函數(shù)中的。那樣程序運(yùn)行之后,就可以輸出二叉樹的先序遍歷了。
可以是輸出結(jié)點(diǎn),也可以是計(jì)算結(jié)點(diǎn)
當(dāng)你先序遍歷時(shí),他就可以是輸出結(jié)點(diǎn)