漫漫编程路——C篇(一)——关于创建二叉树及其遍历

写了几篇C++的,原本不想写数据结构的,因为我对自己抄袭书上的算法的行为深以为耻,但既然写了C++不写C好像对不起C语言,平衡一下,就有了这个C篇了,但是我的数据结构的程序剩下的确实不多了,就先写这个二叉树吧。
  二叉树有几种遍历的方法,这里只列出了前序创建和中序遍历,并使用三种方法。
程序:
方法一:使用最复杂的栈的方法,并且是非递归的。
#include<stdio.h>
#include<stdlib.h>
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
typedef struct{
BiTree *base;
BiTree *top;
int stacksize;
}SqStack;
int visit(BiTree e){
    printf("%c",e->data);
    return 1;
}
void CreateBiTree(BiTree &T){
    char ch;
scanf("%c",&ch);
if(ch=='#') T=NULL;
else
{
if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))
printf("overflow");
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void InitStack(SqStack &S){
S.base=(BiTree *)malloc(100*sizeof(BiTree));
if(!S.base) printf("存储分配失败");
S.top=S.base;
S.stacksize=10;
}
void Push(SqStack &s,BiTree e){
    if(s.top-s.base>=s.stacksize){
    s.base=(BiTree *)realloc(s.base,(s.stacksize+10)*sizeof(BiTree));
    if(!s.base) printf("存储分配失败");
    s.top=s.base+s.stacksize;
    s.stacksize+=10;
    }
    *s.top++=e;
}
void Pop(SqStack &s,BiTree &e){
if(s.top==s.base) printf("错误");
e=*--s.top;
}
BiTree GetTop(SqStack S,BiTree &e){
    if(S.base==S.top)
        printf("错误!");
    e=*(S.top-1);
    return e;
}
void Inorder(BiTree T)
{
    BiTree p;
SqStack S;
InitStack(S);
p=T;
Push(S,T);
while(!(S.top==S.base)){
while(GetTop(S,p)&&p)
Push(S,p->lchild);
Pop(S,p);
if(!(S.top==S.base)){
Pop(S,p);
visit(p);
Push(S,p->rchild);
}
}
}
void main(){
    BiTree T;
    printf("请创建二叉树:");
 CreateBiTree(T);
 printf("创建成功!/n");
 printf("中序遍历二叉树:");
Inorder(T);
}
方法二:不使用栈的非递归方法
#include<stdio.h>
#include<stdlib.h>
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void CreateBiTree(BiTree &T){
    char ch;
scanf("%c",&ch);
if(ch=='#') T=NULL;
else
{
if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))
printf("overflow");
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void Inorder(BiTree T)
{
BiTree t[100];
int top=0;
while(T||top)
{
while(T)
{
t[++top]=T;T=T->lchild;
}
if(top)
{
printf("%c",t[top]->data);
T=t[top--]->rchild;
}
}
}
void main(){
    BiTree T;
    printf("请创建二叉树:");
 CreateBiTree(T);
 printf("创建成功!/n");
 printf("中序遍历二叉树:");
Inorder(T);
}
方法三:剩下的是递归方法了
#include<stdio.h>
#include<stdlib.h>
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void CreateBiTree(BiTree &T){
    char ch;
scanf("%c",&ch);
if(ch=='#') T=NULL;
else
{
if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))
printf("overflow");
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void Inorder(BiTree T)
{
     if(T!=NULL)
     {
         Inorder(T->lchild);
          printf("%c",T->data);
          Inorder(T->rchild);
     }
}
void main(){
    BiTree T;
    printf("请创建二叉树:");
 CreateBiTree(T);
 printf("创建成功!/n");
 printf("中序遍历二叉树:");
Inorder(T);
}
三种方法中,递归的最简单,并不推荐,而第一种是比较好的方法,只要理解算法就能比较容易得写出程序来了,虽然算法一样,但每个人的理解不同还是会出现不同的方案的,龙还生九子呢,数据结构还是以理解为主,向我这种不劳而获的方式不太可取,惭愧啊
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据结构是一门实践性很强的课程,只靠读书和做习题是不能提高实践能力的,尤其是在数据结构中要解决的问题更接近于实际。数据结构的实验是对学生的一种全面的综合训练,与程序设计语言课程中的实验不同,数据结构课程中的实验多属创造性的活动,需要学生自己分析问题,设计数据结构算法,再上机调试和测试程序。数据结构实验是一种自主性很强的学习过程,其教学目的主要有两个:(1)深化理解和掌握书本上的理论知识,将书本上的知识变“活”;(2)理论和实践相结合,使学生学会如何把书本上有关数据结构算法的知识用于解决实际问题,培养数据结构的应用能力和软件工程所需要的实践能力。 为了达到上述目的,本书安排了如下三类实验: (1)验证实验:其主要内容是将书上的重要数据结构上机实现,深化理解和掌握理论知识,这部分的实验不需要学生自己设计,只须将给定的方案实现即可; (2)设计实验:其主要内容是针对具体问题,应用某一个知识点,自己设计方案,并上机实现,目的是培养学生对数据结构的简单应用能力; (3)综合实验:其主要内容是针对具体问题,应用某几个知识点,自己设计方案,并上机实现,目的是培养学生对数据结构的综合应用能力。 在验证实验中,由实验目的、实验内容、实现提示和实验程序等4部分组成,其中实验目的明确了该实验要学生掌握哪些知识点;实验内容规定了实验的具体任务;实现提示给出了数据结构算法的设计方法;实验程序给出了实验的范例程序,并且在主教材的随书光盘中有该实验涉及到的数据结构的全部实现。在验证实验中,不要求但鼓励学生在完成实验任务的基础上,对该实验涉及的数据结构的其他实现方法进行探索。 在设计实验和综合实验中,由问题描述、基本要求、设计思想、思考题等4部分组成,其中问题描述是为学生建立问题的背景环境,指明“问题是什么”;基本要求是对问题的实现进行基本规范,保证预定的训练意图,使某些难点和重点不会被绕过去,而且也便于教学检查;设计思想给出了设计数据结构算法的主要思;思考题引导学生在做完实验后进行总结和扩充。 虽然在设计实验和综合实验中都给出了一定的设计方案,但是,学生不应拘泥于这些分析和设计,要尽量发挥想象力和创造力。对于一个实际问题,每个人可能会有不同的解决办法,本书给出的范例方案,只是希望把学生的思引人正轨,提出了思考问题的方法,但是不希望限制学生的思维,鼓励学生自己设计解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值