二叉树(C语言)
发布时间:2025-05-13 21:37:28 发布人:远客网络
一、二叉树(C语言)
这个问题,可以看成完全二叉树,有性质有节点i的父节点为: i/2.
而题目要求的意思也就是找到两个节点的公共父节点。(含可能为其中一个节点)
找到较大的那个,(循环的,因不断改变,所以需不断比较)
做x=x/2;(假设此时x较大,x为int型)
(因马上断电,不给代码了,思路就是这样。。。)
二、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、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");