c语言递归建链表,递归创建二叉树c语言实现+详细解释
該樓層疑似違規(guī)已被系統(tǒng)折疊?隱藏此樓查看此樓
void?CreatBiTree(BiTree?T)
{
char?a;
scanf("%c",&a);
if(a=='@')
T=NULL;
else
{
T=(BiTree)malloc(sizeof(BiNode));
T->data=a;
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
}
}
雖能編譯,但不能正確運行,冥思苦想n小時,未果
遂改其為
BiTree?CreatBiTree()
{
char?a;
BiTree?T;
scanf("%c",&a);
if(a=='@')
T=NULL;
else
{
T=(BiTree)malloc(sizeof(BiNode));
T->data=a;
T->lchild=CreatBiTree();
T->rchild=CreatBiTree();
}
return?T;
}
不再用傳遞參數(shù),用返回值,正確編譯運行,喜。
重審前程序,改為
void?CreatBiTree(BiTree?*T)
{
char?a;
scanf("%c",&a);
if(a=='@')
*T=NULL;
else
{
*T=(BiTree)malloc(sizeof(BiNode));
(*T)->data=a;
CreatBiTree(&((*T)->lchild));
CreatBiTree(&((*T)->rchild));
}
}
正確編譯運行,惑。
又冥思苦想n小時,終于悟出其中原由(好象多難似的,或者其實是我太愚鈍)
原來還是對指針的理解不夠深刻
最開始的程序傳遞的是Node型結(jié)構(gòu)體的指針,于是在函數(shù)中會生成一個形參也指向這個結(jié)構(gòu)體,但在函數(shù)中有一句T=(BiTree)malloc(sizeof(BiNode));?改變了形參的指向,以后再對形參的任何操作不會在主函數(shù)中的T產(chǎn)生影響。
下面是兩個完整的程序,分別用的兩種建樹方法
#include?"stdlib.h"
#include?"conio.h"
typedef?struct?node
{
char?data;
struct?node?*lchild,*rchild;
}BiNode,*BiTree;
BiTree?CreatBiTree()
{
char?a;
BiTree?T;
scanf("%c",&a);
if(a=='@')
T=NULL;
else
{
T=(BiTree)malloc(sizeof(BiNode));
T->data=a;
T->lchild=CreatBiTree();
T->rchild=CreatBiTree();
}
return?T;
}
void?PreOrderTraverse(BiTree?T)
{
if(T)
{
printf("%c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void?InOrderTraverse(BiTree?T)
{
if(T)
{
InOrderTraverse(T->lchild);
printf("%c",T->data);
InOrderTraverse(T->rchild);
}
}
void?PostOrderTraverse(BiTree?T)
{
if(T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c",T->data);
}
}
main()
{
BiTree?T;
clrscr();
T=CreatBiTree();
PreOrderTraverse(T);
printf("\n");
InOrderTraverse(T);
printf("\n");
PostOrderTraverse(T);
}
二
#include?"stdlib.h"
#include?"conio.h"
typedef?struct?node
{
char?data;
struct?node?*lchild,*rchild;
}BiNode,*BiTree;
void?CreatBiTree(BiTree?*T)
{
char?a;
scanf("%c",&a);
if(a=='@')
*T=NULL;
else
{
*T=(BiTree)malloc(sizeof(BiNode));
(*T)->data=a;
CreatBiTree(&((*T)->lchild));
CreatBiTree(&((*T)->rchild));
}
}
void?PreOrderTraverse(BiTree?T)
{
if(T)
{
printf("%c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void?InOrderTraverse(BiTree?T)
{
if(T)
{
InOrderTraverse(T->lchild);
printf("%c",T->data);
InOrderTraverse(T->rchild);
}
}
void?PostOrderTraverse(BiTree?T)
{
if(T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c",T->data);
}
}
main()
{
BiTree?T;
clrscr();
CreatBiTree(&T);
PreOrderTraverse(T);
printf("\n");
InOrderTraverse(T);
printf("\n");
PostOrderTraverse(T);
}
更多數(shù)據(jù)結(jié)構(gòu)實例http://hi.baidu.com/longzuo
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的c语言递归建链表,递归创建二叉树c语言实现+详细解释的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 交换机putty怎么调试_使用在300和
- 下一篇: vmware 搭建k8s无法ping通子