带有菜单的二叉树链表C语言,C语言编程二叉树

这篇博客详细介绍了如何使用C语言构建二叉树的二叉链表结构,并实现各种遍历算法,包括递归和非递归的中序、前序、后序遍历,以及层次遍历。此外,还涵盖了计算二叉树高度、节点数量、叶子节点数量以及交换二叉树所有节点的左右子树等功能。通过这些实践,作者强调了理解数据结构的重要性,并分享了在编程过程中遇到的问题和解决经验。
摘要由CSDN通过智能技术生成

《C语言编程二叉树》由会员分享,可在线阅读,更多相关《C语言编程二叉树(13页珍藏版)》请在人人文库网上搜索。

1、实验内容:1. 编写函数,输入字符序列,建立二叉树的二叉链表。2. 编写函数,实现二叉树的中序递归遍历算法。(最好也能实现前缀和后缀 遍历算法)3. 编写函数,实现二叉树的中序非递归遍历算法。4. 编写函数,借助队列实现二叉树的层次遍历算法。5. 编写函数,求二叉树的高度。6. 编写函数,求二叉树的结点个数。7. 编写函数,求二叉树的叶子个数。8. 编写函数,交换二叉树每个结点的左子树和右子树。9. 编写一个主函数,在主函数中设计一个简单的菜单,分别调试上述算法。实验目的及要求:1. 掌握二叉树的存储实现2. 掌握二叉树的遍历思想3. 掌握二叉树的常见算法的程序实现实验内容、方法与步骤:(使用。

2、附页填写并附在本页后)实验结果:-|p|x|谙输入结点的前序序列创逢二叉树:0表示空:ABCOODEOOOFOGOO谙选择:2递归-中序遍历二叉树:CBEDAFG1 递归创建二叉链表2 递归-中序遍历二叉树3 递归前序遍历二叉树4递归后序遍历二叉树5 非递归中序遍历二叉树6 层次-遍历二叉树7 二叉树的高度8 二叉树的结点个数9 二叉树的叶子结点个数10 交换二叉树的所有左右子树 6邁出泉坯1 递归创建二叉链表2 递归中序遍历二叉树3 递归-前序遍历二叉树4递归后序遍历二叉树5 非递归中序遍历二叉树6 层次-遍历二叉树-|g|x|1 递归创建二叉樋表2 递归中序遍历二叉树3 递归前序遍历二叉树。

3、4递归后序遍历二叉树5 非递归-中序握历二叉树6 层次遍历二叉树7 二叉树的高度8 二叉树的结点个数9 二叉树的叶子结点个数10 交换二叉树的所有左右子树6邁出亲统诘选择:3 递归前序遍历二叉利:ABCDEFG1 递归创建二叉植表2 递归中序遍历二叉树3 递归前序遍历二叉树4递归-后序遍历二叉树5 非递归中序遍历二叉树6 层次遍历二叉树7 二叉树的高度8 二叉树的结点个数03-|p|x|1 递归创建二叉犍表2 递归中序遍历二叉树酬翅二叉树2d7 二叉树的高度8 二叉树的结点个数9 二叉树的叶子结点个数10 交换二叉树的所有左右子树6启岀亲绕诘选择:7 二叉科的咼度为:41 递归创建二叉链表2 。

4、递归中序遍历二叉树3 递归前序遍历二叉树4 递归后序遍历二叉树5 非递归中序遍历二叉树6 层次遍历二叉树7 二叉树的高度I 口国1 递归创建二叉链表2 递归中序遍历二叉树3 递归前序遍历二叉树4 递归后存遍历二叉树5 非递归-中序遍历二叉树B 层次-遍历二叉树7 二叉树的高度8 二叉树的结点个数9 二叉树的叶子结点个数10交换二叉树的所有左右子树。追岀亲绕谙选择:8 二叉材的结点数为:71 递归创建二叉链表2 递归中序遍历二叉树3 递归-前序遍历二叉树4递归后序遍历二叉树5 非递归中序遍历二叉树6 层次遍历二叉树-|n|x|1 递归创建二叉樋表2 递归中序遍历二叉树3 递归前序遍历二叉树4递归。

5、后序遍历二叉树5 非递归-中序握历二叉树6 层次遍历二叉树7 二叉树的高度8 二叉树的结点个数9 二叉树的叶子结点个数10 交换二叉树的所有左右子树6足岀亲绕诘选择:9 二叉科中叶子结点数为:31 递归创逢二叉涟表2 递归中序遍历二叉树3 递归前序遍历二叉树4递归后序遍历二叉树5 非递归中序遍历二叉树6 层次-遍历二叉树7 二叉树的高度8 二叉树的结点个数小结:通过这次实验,我体会到深刻理解数据结构的重要性,只有真正理解定义 数据类型的好处才能用好这样一种数据结构。在一开始定义数据结构时,不够细心,总有问题出现,如数据域与指针域 的定义类型的不同,在输好了结构体之后,我开始一个个编写本实验要求。

6、实现 功能的子函数。以前总觉得使用递归算法是非常难的事情,很复杂很乱,经常会理解不了 而导致编程出错,但这次的实验中二叉树的中序、先序、后序遍历都使用了递 归算法,而且用起来并不复杂,这使我更进一步地学习和理解了函数的递归调用并得到灵活的运用还有,再次发现自己对指针的认识还很肤浅,也常常使所设计的程序无法 实现需求功能,所以最后我选择了栈的链式存储结构来实现。通过本实验调试过程中出现的一些问题,我对二叉树的结构有了较为深入 的理解,相信以后在更多的尝试之中,自己会不断进步。#include vstdio.h#include #define MAXSIZE 100typedef char Dat。

7、aType;typedef struct BiTNode /* 二叉链表存储结构 */ DataType data;struct BiTNode *lchild,*rchild;BiTree;typedef BiTree* ElemType ; /*栈中数据元素类型,栈中保存结点指针*/typedef struct ElemType dataMAXSIZE;int top;SeqStack;/*栈的类型定义,顺序栈*/typedef structElemType queueMAXSIZE;int front,rear;SP;SeqStack *initSeqStack() /* 初始化栈 */。

8、 SeqStack *s;/*首先建立栈空间,然后初始化栈顶指针*/s=(SeqStack*)malloc(sizeof(SeqStack);s-top=-1;return s;int push(SeqStack *s,ElemType x) if(s-top=MAXSIZE-1) /* 栈满不能入栈 */ printf(栈满); return 0;s-top+;s-datas-top=x;return 1;void pop(SeqStack *s) /* 出栈,假设栈不空 */s-top-; int empty(SeqStack *s) if(s-top=-1) return 1;else 。

9、return 0;ElemType top(SeqStack *s) /* 设栈不空 */ return (s-datas-top);/* 递归算法创建二叉链表 */BiTree *createBiTree() DataType ch;BiTree *T; ch=getchar(); if(ch=0) return NULL; else T=(BiTree *)malloc(sizeof(BiTree);T-data=ch;T-lchild=createBiTree();T-rchild=createBiTree(); return T; /* 中序遍历二叉树的递归算法 */void InOr。

10、der(BiTree *T) if(T) InOrder(T-lchild);printf(%c,T-data); InOrder(T-rchild);/* 前序遍历二叉树的递归算法 */void PreOrder(BiTree *T) if(T) printf(%c,T-data);PreOrder(T-lchild);PreOrder(T-rchild);/* 后序遍历二叉树的递归算法 */void PostOrder (BiTree *T) if(T) PostOrder(T-lchild);PostOrder(T-rchild); printf(%c,T-data);/* 中序遍历二叉。

11、树的非递归算法 */void InOrderFei(BiTree *p) SeqStack *s; s=initSeqStack();while(1) while(p) push(s,p); p=p-lchild; /* 先将结点指针压栈,待出栈时再访问 */ if(empty(s) break;p=top(s); pop(s); printf(%c,p-data); p=p-rchild;/* 按层次遍历 */void LevelOrder(BiTree *T) SP *p;p=(SP*)malloc(sizeof(SP); p-front=0;p-rear=0; if(T!=NULL) p。

12、-queuep-front=T; p-front=p-front+1; while(p-front!=p-rear) T=p-queuep-rear; p-rear=p-rear+1; printf(%c,T-data);if(T-lchild!=NULL) p-queuep-front=T-lchild;/* 左孩子进队列 */ p-front=p-front+1;if(T-rchild!=NULL) p-queuep-front=T-rchild;/* 右孩子进队列 */ p-front=p-front+1; /* 求二叉树的高度 */ int height(BiTree *T) int 。

13、i,j;if(!T) return 0;i=height(T-lchild); /* 求左子树的高度 */ j=height(T-rchild);/* 求右子树的高度 */return ij?i+1:j+1;/* 二叉树的高度为左右子树中较高的高度加1 */* 求二叉树的所有结点个数 */int Nodes(BiTree *T) int n1,n2; if(T=NULL) return 0; else if(T-lchild=NULL&T-rchild=NULL) return 1; else n1=Nodes(T-lchild);n2=Nodes(T-rchild); return n1+n。

14、2+1; /* 求二叉树的叶子结点个数 */int leafs(BiTree *T) int num1,num2; if(T=NULL) return 0; elseif(T-lchild=NULL&T-rchild=NULL) return 1;num1=leafs(T-lchild); /* 求左子树中叶子结点数 */ num2=leafs(T-rchild); /* 求右子树中叶子结点数 */ return num1+num2; /* 交换二叉树的所有左右子树 */void exchange(BiTree *T) BiTree *temp=NULL;if(T-lchild=NULL&T-。

15、rchild=NULL) return;elsetemp=T-lchild;T-lchild=T-rchild;T-rchild=temp;if(T-lchild) exchange(T-lchild);if(T-rchild) exchange(T-rchild);/* 交换后二叉树的遍历 */void Display(BiTree *T)printf(t 交换后二叉树按中序遍历输出 :);InOrder(T);printf(n);printf(t 交换后二叉树按前序遍历输出 :);PreOrder(T);printf(n);printf(t 交换后二叉树按后序遍历输出 :);PostOrd。

16、er(T);printf(n);void menu() printf(n);printf(tt1.递归刨建二叉链表n);printf(tt2. 递归 -中序遍历二叉树 n);printf(tt3. 递归 -前序遍历二叉树 n);printf(tt4. 递归 -后序遍历二叉树 n);printf(tt5. 非递归 -中序遍历二叉树 n);printf(tt6. 层次 -遍历二叉树 n);printf(tt7. 二叉树的高度 n);printf(tt8. 二叉树的结点个数 n);printf(tt9. 二叉树的叶子结点个数 n);printf(tt10. 交换二叉树的所有左右子树 n);print。

17、f(tt0. 退出系统 n);printf(nt 请选择 :);void main() BiTree *bt; bt=NULL;int n,m=1;while(m)menu(); scanf(%d,&n); getchar();switch(n)case 1:printf(nt 请输入结点的前序序列创建二叉树 :0表示空 :); bt=createBiTree(); break;/* 生成二叉树 */case 2:printf(nt 递归-中序遍历二叉树:);InOrder(bt);printf(n); break;case 3:printf(nt递归-前序遍历二叉树:);PreOrder(b。

18、t); printf(n); break; case 4:printf(nt递归-后序遍历二叉树:);PostOrder(bt);printf(n); break; case 5:printf(nt非递归-中序遍历二叉树);InOrderFei(bt);printf(n); break; case 6:printf(nt按层次遍历二叉树:);LevelOrder(bt);printf(n); break; case 7:printf(nt二叉树的高度为:dn,height(bt);printf(n); break; case 8:printf(nt二叉树的结点数为:dn,Nodes(bt);printf(n); break; case 9:printf(nt 二叉树中叶子结点数为:dn,leafs(bt); break;);printf(nn);case 10:printf(nt 交换二叉树的所有左右子树 exchange(bt);Display(bt); break;case 0:m=0;。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值