您当前的位置:首页 > 互联网教程

c语言 关于二叉树的创建和遍历(中序遍历)

发布时间:2025-05-12 14:47:25    发布人:远客网络

c语言 关于二叉树的创建和遍历(中序遍历)

一、c语言 关于二叉树的创建和遍历(中序遍历)

1、这个还是我学《数据结构》时做的有关二叉树的练习呢,本来是全的,包括树的初始化,建立,遍历(中序、前序、后序和层次),还有输出,复制,删除节点,求深度,树的删除等等,看你只问了有关创建和中序遍历的,所以选了一部分给你,供你参考吧!

2、void InitBtree(BiTNode*&BT){//初始化二叉树

3、void CreateBiTree(BiTNode*&BT,char*str){//建立二叉树

4、BiTNode*s[MaxSize];//这里定义了一个数组用作堆栈方便检查输入和操作

5、p=(struct BiTNode*) malloc(sizeof(struct BiTNode));

6、p->lchild=p->rchild=NULL;

7、void inorder(BiTNode*BT){//中序遍历二叉树——递归形式

8、printf("以广义表形式表示输入的二叉数(如A(B(C,D),E(,F))的形式)\n\n");

9、char string[Number]="A(B(,C),D(E(F),G(,H)))";

10、//如果想要自己输入,可以将下边的注释去掉,然后自己按照广义表形式输入,

11、//(如上例的形式)此处为了方便查看,用了默认的数值

12、//这里之所以用此种形式(广义表形式输入)是为了保证输入的数组成的二叉树完全符合你所定义的树的形状

13、while(ch!='\n'&& i<Number){

14、CreateBiTree(BT,string);//创建二叉树

15、printf("\n中序遍历二叉树顺序为:");

16、程序不复杂,所以只是加了必要和最简单的注释,相信你看看应该完全可以理解的,祝你进步!

二、二叉树的建立与遍历(C语言)

1、楼主你好~~~“ф”字符的源代码我忘记了,我这里有一个自己写过的遍历算法

2、 struct btnode*Lchild,*Rchild;

3、 cout<<p->data<<"";

4、 cout<<p->data<<"";

5、 cout<<p->data<<"";

6、 cout<<"请选择所需功能('A'输出该二叉树序列,'B'输出交换后二叉树序列)"<<endl;

7、 cout<<"交换二叉树前序:";

8、 cout<<"交换二叉树中序:";

9、 cout<<"交换二叉树后序:";

10、这个算法输入时要以“#”代表空节点,及将[测试数据]“ABCффDEфGффFффф”改成“ABC##DE#G##F###”即可。另外我的算法包括了二叉树左右子树交换的代码“change(bitreptr&p)”,只要楼主稍作修改就可以得到你想要的完美结果~

三、关于数据结构C语言二叉树的程序,请人帮忙看看~谢谢

1、给你完全调好了,一切正常运行:

2、typedef int status;//C中没有status类型,所以想使用这个类型你必须定义它

3、#define OVERFLOW-2//OK、OVERLFLOW、ERROR这些宏的定义头文件中是没有的,所以你必须自己定义它们

4、struct BiTNode*lchild,*rchild;

5、struct QNode*next;//马虎。少个字符Q

6、/*printf("Input the char\n");//你把输出语句放到递归的函数里它会输出N多遍,所以,还是放到主函数里吧*/

7、scanf("%c",&ch);//你忘了取地址符了

8、/*if(ch=='#')T==NULL;*/ if(ch=='#')T=NULL;//是将T指针赋值为空,而不是T==NULL;

9、if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))exit(OVERFLOW);

10、/**T.data=ch;*/T->data=ch;//楼主要仔细研究一下指向运算符"->"和结构体成员运算符"."的区别,此程序中N多错误都是因为没有区分它们引起的

11、status DLR(BiTree root)//void类型是不能返回值的,所以你可以把函数改成status类型;函数参数不用引用。因为没有改变参数值,只是使用

12、DLR(root->rchild);//这一点属于严重错误,说明你没有弄清递归遍历的过程。是先根,再左,再右。下面还有三个同样的错误

13、status LDR(BiTree root)//函数参数不用引用。因为没有改变参数值,只是使用

14、status LRD(BiTree root)//函数参数不用引用。因为没有改变参数值,只是使用

15、Found_SUM(root->rchild);//递归求结点数,和遍历函数有什么关系?

16、if(!root->lchild&&!root->rchild)j++;

17、FOUND_LEAVES(root->lchild);

18、FOUND_LEAVES(root->rchild);

19、status InitQueue(LinkQueue&Q)//这儿应该是初始化队列,而不是销毁队列吧。。。汗。。。你原来的步骤是用来销毁队列Q的啊

20、Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));

21、status EnQueue(LinkQueue&Q,BiTree e)

22、p=(QueuePtr)malloc(sizeof(QNode));//马虎,少个右括号

23、p->data=e;p->next=NULL;//马虎,两个语句要用";"分开

24、status DeQueue(LinkQueue&Q,BiTree&e)//此处添加一个引用参数e较为方便,你原来的方法太复杂了

25、if(Q.front==Q.rear)return ERROR;

26、while(Q.front<Q.rear)//如果队列非空

27、if(root->lchild)EnQueue(Q,root->lchild);

28、if(root->rchild)EnQueue(Q,root->rchild);

29、T=(BiTree)malloc(sizeof(BiTNode));

30、printf("Input the char\n");

31、printf("先序遍历二叉树:\n");

32、printf("中序遍历二叉树:\n");

33、printf("后序遍历二叉树:\n");

34、printf("层序遍历二叉树:\n");

35、/*LSCAN(T);//不知你为啥要用两遍这个函数,给你注释掉了一个*/

36、printf("叶子结点数目%d",b);printf("\n");