用C语言编写二叉树的建立与遍历.docx
- 文档编号:24469902
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:65
- 大小:132.14KB
用C语言编写二叉树的建立与遍历.docx
《用C语言编写二叉树的建立与遍历.docx》由会员分享,可在线阅读,更多相关《用C语言编写二叉树的建立与遍历.docx(65页珍藏版)》请在冰豆网上搜索。
用C语言编写二叉树的建立与遍历
用C语言编写二叉树的建立与遍历
1.对题目要有需求分析
在需求分析中,将题目中要求的功能进行叙述分析,并且设计解决此问题的数据存储结构,设计或叙述解决此问题的算法。
给出实现功能的一组或多组测试数据,程序调试后,将按照此测试数据进行测试的结果列出来。
如果程序不能正常运行,写出实现此算法中遇到的问题和改进方法;
2.对题目要有相应的源程序
源程序要按照写程序的规则来编写。
要结构清晰,重点函数的重点变量,重点功能部分要加上清晰的程序注释。
(注释量占总代码的四分之一)
程序能够运行,要有基本的容错功能。
尽量避免出现操作错误时出现死循环;
3.最后提供的主程序可以象一个应用系统一样有主窗口,通过主菜单和分级菜单调用课程设计中要求完成的各个功能模块,调用后可以返回到主菜单,继续选择其他功能进行其他功能的选择。
二叉树的建立与遍历
[问题描述]
建立一棵二叉树,并对其进行遍历(先序、中序、后序),打印输出遍历结果。
[基本要求]
从键盘接受输入,以二叉链表作为存储结构,建立二叉树,并对其进行遍历(先序、中序、后序),将遍历结果打印输出。
以下是我的数据结构实验的作业:
肯定好用,里面还包括了统计树的深度和叶子数!
记住每次做完一个遍历还要重新输入你的树哦!
#include"stdio.h"
#include"string.h"
#defineNULL0
typedefstructBiTNode{
chardata;
structBiTNode*lchild,*rchild;
}BiTNode,*BiTree;
BiTreeCreate(BiTreeT){
charch;
ch=getchar();
if(ch=='#')
T=NULL;
else{
if(!
(T=(BiTNode*)malloc(sizeof(BiTNode))))
printf("Error!
");
T->data=ch;
T->lchild=Create(T->lchild);
T->rchild=Create(T->rchild);
}
returnT;
}
voidPreorder(BiTreeT){
if(T){
printf("%c",T->data);
Preorder(T->lchild);
Preorder(T->rchild);
}
}
intSumleaf(BiTreeT){
intsum=0,m,n;
if(T){
if((!
T->lchild)&&(!
T->rchild))
sum++;
m=Sumleaf(T->lchild);
sum+=m;
n=Sumleaf(T->rchild);
sum+=n;
}
returnsum;
}
voidzhongxu(BiTreeT){
if(T){
zhongxu(T->lchild);
printf("%c",T->data);
zhongxu(T->rchild);
}
}
voidhouxu(BiTreeT){
if(T){
houxu(T->lchild);
houxu(T->rchild);
printf("%c",T->data);
}
}
intDepth(BiTreeT){
intdep=0,depl,depr;
if(!
T)dep=0;
else{
depl=Depth(T->lchild);
depr=Depth(T->rchild);
dep=1+(depl>depr?
depl:
depr);
}
returndep;
}
main(){
BiTreeT;
intsum,dep;
T=Create(T);
Preorder(T);
printf("\n");
zhongxu(T);
printf("\n");
houxu(T);
printf("\n");
sum=Sumleaf(T);
printf("%d",sum);
dep=Depth(T);
printf("\n%d",dep);
}
在TurboC的环境下,先按Ctrl+F9运行程序,此时就是建立二叉树的过程,例如输入序列ABC##DE#G##F###(其中的“#”表示空,并且输入过程中不要加回车,因为回车也有对应的ASCII码,是要算字符的,但是输入完之后可以按回车退出),然后再按ALT+F5显示用户界面,这时候就能够看到结果了。
另外你必须会手动建立一棵二叉树,保证你输入的序列能构成一棵二叉树,否则你怎么输入,按最后按多少回车程序也不会结束!
下面是我举的例子的二叉树的图形表示(画的不好,别见笑),如果可能,把你想建立的二叉树也发上来!
使用标准C语言编写创建有序二叉树的算法
最佳答案
#include
#include
#defineNULL0
#definemaxsize100
#defineLENsizeof(structstudent)
typedefstructstudent
{structstudent*lchild,*rchild;
chardata;
}*STU;
STUstree_creat(char*s,intk)
{STUp;
if(s[k]=='\0'||k>maxsize)
returnNULL;
else
{p=(STU)malloc(LEN);
p->data=s[k];
p->lchild=stree_creat(s,2*k+1);
p->rchild=stree_creat(s,2*k+2);
returnp;
}
}
voidprint(STUp)
{STUh[maxsize]={NULL};
inttop=0,base=0;
h[top]=p;
printf("Thechengciorder:
\n\n");
while(h[base]!
=NULL)
{
printf("[%c]",h[base]->data);
h[++top]=h[base]->lchild;
h[++top]=h[base]->rchild;
base++;
}
printf("\nSuccess......\n\n");
}
/*前序遍历*/
voidPreorder(STUp)
{if(p)
{
printf("[%c]",p->data);
Preorder(p->lchild);
Preorder(p->rchild);
}
}
/*中序遍历*/
voidInorder(STUp)
{if(p)
{
Inorder(p->lchild);
printf("[%c]",p->data);
Inorder(p->rchild);
}
}
/*后序遍历*/
voidPostorder(STUp)
{if(p)
{
Postorder(p->lchild);
Postorder(p->rchild);
printf("[%c]",p->data);
}
}
/*交换该二叉树中所有结点左右孩子的非递归算法*/
voidconver(chara[],intm)
{inti,j,h=1,k=2;
chart;
for(i=1;i<=(int)(log(m+1)+1);i++)
{for(j=0;j {t=a[h+j];a[h+j]=a[k-j];a[k-j]=t;} h=2*h+1; k=2*k+2; } } main() {STUroot=NULL; inti=0,j=0,h=0; chara[maxsize]={'\0'}; clrscr(); /*用一个数组存放一连串的字符串*/ gets(a); while(a! ='\0') i++; /*建立二叉树*/ root=stree_creat(a,0); printf("\n"); /*输出数组中的内容*/ print(root); /*前序遍历*/ printf("PreorderTraversal........\n"); Preorder(root); printf("\n"); /*中序遍历*/ printf("\nInorderTraversal........\n"); Inorder(root); printf("\n"); /*后序遍历*/ printf("\nPostorderTraversal........\n"); Postorder(root); 追问 F: \1.c(26): warningC4013: 'printf'undefined;assumingexternreturningint F: \1.c(80): warningC4013: 'clrscr'undefined;assumingexternreturningint F: \1.c(82): warningC4013: 'gets'undefined;assumingexternreturningint 编译时没错,连接时有问题,是怎么回事啊? 分享给你的朋友吧: ∙i贴吧 ∙新浪微博 ∙腾讯微博 ∙QQ空间 ∙人人网 ∙豆瓣 ∙MSN 对我有帮助 0 回答时间: 2011-6-717: 46|我来评论 二叉树遍历及C语言实现 二叉树遍历及C语言实现 已知中序和前序序列,或者已知中序和后序序列,都能够构造一棵二叉树。 在本例中,本人用C语言写程序解答了下面两个算法题: (1)给出一棵二叉树的中序与后序遍历序列,求出它的先序遍历序列。 (2)给出一棵二叉树的中序与先序遍历序列,求出它的后序遍历序列。 知识点扼要回顾: 所谓二叉树的遍历,是指按一定的顺序对二叉树中的每个结点均访问一次,且仅访问一。 按照根结点访问位置的不同,通常把二叉树的遍历分为六种: TLR(根左右),TRL(根右左),LTR(左根右) RTL(右根左),LRT(左右根),RLT(右左根) 其中,TRL、RTL和RLT三种顺序在左右子树之间均是先右子树后左子树,这与人们先左后右的习惯不同,因此,往往不予采用。 余下的三种顺序TLR、LTR和LRT根据根访问的位置不同分别被称为前序遍历、中序遍历和后序遍历。 前序遍历的规律是: 输出根结点,输出左子树,输出右子树; 中序遍历的规律是: 输出左子树,输出根结点,输出右子树; 后序遍历的规律是: 输出左子树,输出右子树,输出根结点; 不多说了,看代码吧: ) 1.#include 2.#include 3. 4.using namespace std; 5. 6.//存储节点数据,为简便起见,这里选用字符 7.typedef char DATA_TYPE; 8. 9.typedef struct tagBINARY_TREE_NODE BINARY_TREE_NODE, *LPBINARY_TREE_NODE; 10. 11.struct tagBINARY_TREE_NODE 12.{ 13. DATA_TYPE data; //节点数据 14. LPBINARY_TREE_NODE pLeftChild; //左孩子指针 15. LPBINARY_TREE_NODE pRightChild; //右孩子指针 16.}; 17. 18.// 19.//函数名称: TreeFromMidPost 20.//函数功能: 给出一棵二叉树的中序与后序序列,构造这棵二叉树。 21.//输入参数: LPBINARY_TREE_NODE & lpNode: 二叉树的结点 22.// string mid: 存储了二叉树的中序序列的字符串 23.// string post: 存储了二叉树的后序序列的字符串 24.// int lm, int rm: 二叉树的中序序列在数组mid中的左右边界 25.// int lp, int rp: 二叉树的后序序列在数组post中的左右边界 26.// 27.void TreeFromMidPost(LPBINARY_TREE_NODE & lpNode, string mid, string post, int lm, int rm, int lp, int rp) 28.{ 29. //构造二叉树结点 30. lpNode = new BINARY_TREE_NODE; 31. lpNode->data = post[rp]; 32. lpNode->pLeftChild = NULL; 33. lpNode->pRightChild = NULL; 34. 35. int pos = lm; 36. 37. while (mid[pos] ! = post[rp]) 38. { 39. pos++; 40. } 41. int iLeftChildLen = pos - lm; 42. 43. if (pos > lm)//有左孩子,递归构造左子树 44. { 45. TreeFromMidPost(lpNode->pLeftChild, mid, post, lm, pos - 1, lp, lp + iLeftChildLen - 1); 46. } 47. 48. if (pos < rm)//有右孩子,递归构造右子树 49. { 50. TreeFromMidPost(lpNode->pRightChild, mid, post, pos + 1, rm, lp + iLeftChildLen, rp - 1); 51. } 52.} 53. 54.// 55.//函数名称: TreeFromMidPre 56.//函数功能: 给出一棵二叉树的先序与中序序列,构造这棵二叉树。 57.//输入参数: BINARY_TREE_NODE & lpNode: 二叉树的结点 58.// string mid: 存储了二叉树的中序序列的字符串 59.// string pre: 存储了二叉树的先序序列的字符串 60.// int lm, int rm: 二叉树的中序序列在数组mid中的左右边界 61.// int lp, int rp: 二叉树的先序序列在数组pre中的左右边界 62.// 63.void TreeFromMidPre(LPBINARY_TREE_NODE & lpNode, string mid, string pre, int lm, int rm, int lp, int rp) 64.{ 65. //构造二叉树结点 66. lpNode = new BINARY_TREE_NODE; 67. lpNode->data = pre[lp]; 68. lpNode->pLeftChild = NULL; 69. lpNode->pRightChild = NULL; 70. 71. int pos = lm; 72. 73. while (mid[pos] ! = pre[lp]) 74. { 75. pos++; 76. } 77. int iLeftChildLen = pos - lm; 78. 79. if (pos > lm)//有左孩子,递归构造左子树 80. { 81. TreeFromMidPre(lpNode->pLeftChild, mid, pre, lm, pos - 1, lp + 1, lp + iLeftChildLen); 82. } 83. 84. if (pos < rm)//有右孩子,递归构造右子树 85. { 86. TreeFromMidPre(lpNode->pRightChild, mid, pre, pos + 1, rm, lp + iLeftChildLen + 1, rp); 87. } 88.} 89. 90.//先序遍历 91.void PreOrder(LPBINARY_TREE_NODE p) 92.{ 93. if(p ! = NULL) 94. { 95. cout << p->data; //输出该结点 96. PreOrder(p->pLeftChild); //遍历左子树 97. PreOrder(p->pRightChild); //遍历右子树 98. } 99.} 100. 101.//中序遍历 102.void MidOrder(LPBINARY_TREE_NODE p) 103.{ 104. if(p ! = NULL) 105. { 106. MidOrder(p->pLeftChild); //遍历左子树 107. cout << p->data; //输出该结点 108. MidOrder(p->pRightChild); //遍历右子树 109. } 110.} 111. 112.//后序遍历 113.void PostOrder(LPBINARY_TREE_NODE p) 114.{ 115. if(p ! = NULL) 116. { 117. PostOrder(p->pLeftChild); //遍历左子树 118. PostOrder(p->pRightChild); //遍历右子树 119. cout << p->data; //输出该结点 120. } 121.} 122. 123.//释放二叉树 124.void Release(LPBINARY_TREE_NODE lpNode) 125.{ 126. if(lpNode ! = NULL) 127. { 128. Release(lpNode->pLeftChild); 129. Release(lpNode->pRightChild); 130. delete lpNode; 131. lpNode = NULL; 132. } 133.} 134. 135. 136.int main(int argc, char* argv[]) 137.{ 138. string pre; //存储先序序列 139. string mid; //存储中序序列 140. string post; //存储后序序列 141. 142. LPBINARY_TREE_NODE lpRoot; //二叉树根节点指针 143. 144. 145. cout<<"程序1已知二叉树的中序与后序序列,求先序序列"< 146. cout<<"请先输入中序序列,回车后输入后序序列: "< 147. 148. cin >> mid; 149. cin >> post; 150. 151. TreeFromMidPost(lpRoot, mid, post, 0, mid.size()-1, 0, post.size()-1); 152. cout<<"先序遍历结果: "; 153. PreOrder(lpRoot); 154. cout< 155. 156. cout<<"中序遍历结果: "; 157. MidOrder(lpRoot); 158. cout< 159. 160. cout<<"后序遍历结果: "; 161. PostOrder(lpRoot); 162. cout< 163. Release(lpRoot); 164. cout< 165. 166. cout<<"程序2已知二叉树的中序与先序序列,求后序序列"< 167. cout<<"请先输入先序序列,回车后输入中序序列: "< 168. cin >> pre; 169. cin >> mid; 170. 171. TreeFromMidPre(lpRoot, mid, pre, 0, mid.size()-1, 0, pre.size()-1); 172. cout<<"先序遍历结果: "; 173. PreOrder(lpRoot); 174. cout< 175. 176. cout<<"中序遍历结果: "; 177. MidOrder(lpRoot); 178. cout<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 编写 二叉 建立 遍历