鱼C论坛

 找回密码
 立即注册
查看: 1441|回复: 8

[已解决]求大佬们救救孩子,数据结构作业就要交了,很急很急

[复制链接]
发表于 2021-10-17 12:40:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
实验内容
1、按层序次序输入二叉树中结点的值(字符型或整型),构造顺序存储的二叉树T;
2、判断二叉树是否为空,输出二叉树的深度和根结点的值;
3、分别按层次序列、先序、中序、后序方法遍历二叉树,并打印。


看到帖子的大佬们:
有时间的话能不能瞅一眼孩子的代码,实在是不会了都看一早上了
没时间的话可不可以直接写个答案(不要写太复杂的,我看不懂TAT),我慢慢观摩
#include<stdio.h>
#include<conio.h>
#include<malloc.h>
#include<stdlib.h>

// 定义二叉树二叉列表存储结构 结构体 BiTNode
typedef struct BiTNode{    
        char data;
        struct BiTNode *lchild, *rchild;
}BiTNode,*BiTree;

//创建一棵二叉树
//按书上写的敲下来的,看不太懂 
BiTree CreateBiTree(BiTree T){
        char ch;
        printf("请输入节点:\n");
        scanf("%c",&ch);
        fflush(stdin);    //清空输入缓冲区
        if (ch=='\0')
        {
                T=NULL; 
        }
        else{
                if(!(BiTree*)malloc(sizeof(BiTNode))) exit(0); 
                //判断内存分配空间是否成功,给T指针分配连续的BiTree类型所占字节数的内存空间
                T->data = ch;
                T->lchild = CreateBiTree(T->lchild);
                T->rchild = CreateBiTree(T->rchild);
        }
        return(T);
} 
//如何实现输出根结点? 
//遍历二叉树 
void level(BiTNode *T)
{
        //层次遍历二叉树 
        int front, rear,maxSize;
        BiTNode *que[maxSize];
        front = rear = 0;
        BiTNode *p;
        rear = (rear+1) % maxSize;
        que[rear] = T;
        while(front != rear)
        {
                p = que[front];
                //Visit(p); //我该怎么定义这个visit函数呢? 
                if(p->lchild != NULL)
                {
                        rear = (rear+1) % maxSize;
                        que[rear] = p->lchild;
                }
                if(p->rchild != NULL)
                {
                        rear = (rear+1) % maxSize;
                        que[rear] = p->rchild;
                }
        }

}

//遍历二叉树
//void LevelOrder(BiTree *T) {
//        //层次序列遍历 
//    InitQueue(Q); //初始化一个队列Q
//    BiTree *p; //p用来跟踪队头元素
//    EnQueue(Q,T); //根节点入队
//    while(!IsEmpty(Q)) {
//        DeQueue(Q,p);
//        visit(p);
//        if(p->lchild!=null) {
//            EnQueue(Q,p->lchild);
//        }
//        if(p->rchild!=null) {
//            EnQueue(Q,p->rchild);
//        }
//        }
//}

//先序遍历
void  PreOrderTraverse(BiTree T){
        if(T){
                printf("%c",T->data);                        // 打印 当前节点存储的数据 
                PreOrderTraverse(T->lchild);        // 遍历左节点树 
                PreOrderTraverse(T->rchild);        // 遍历右节点树 
        }
}

//中序遍历
void InOrderTraverse(BiTree T){
        if(T){
                InOrderTraverse(T->lchild);
                printf("%c",T->data);
                InOrderTraverse(T->rchild);
        } 
}

//后序遍历
void PostOrderTraverse(BiTree T){
        if(T){
                PostOrderTraverse(T->lchild);
                PostOrderTraverse(T->rchild);
                printf("%c",T->data);
        } 
}

//返回二叉树的深度
int GetDepth(BiTree T) 
{
        int l,r,c;
        l=r=c=0;
        if(T) {
                l=GetDepth(T->lchild);
                r=GetDepth(T->rchild);
                c=(l>r?l:r);
                return c+1;
        }
        else {
                return 0;
        }
} 


int main()
{
         BiTree T;
         T=CreateBiTree(T);
         //判断二叉树是否为空 
         if(T)                // todo 这一行有问题 
                 printf("二叉树不为空\n");
         else
                 printf("二叉树为空\n");
        printf("二叉树的深度是:\n");
        printf("%d\n",GetDepth(T));
        if(T)
                printf("%c\n",T->data); //输出二叉树根结点的值  todo 但是不需要这个代码 下面会打印的 
        printf("输出按层次序列遍历二叉树:\n");        
         level(T); 
         printf("输出按先序遍历二叉树:\n");        
         PreOrderTraverse(T);
         printf("输出按中序遍历二叉树:\n");        
         InOrderTraverse(T);
         printf("输出按后序遍历二叉树:\n");        
         PostOrderTraverse(T);
         return 0;
 }
最佳答案
2021-10-17 13:22:37
这是前中后序的,你自己看一下算法,自己加一个层次遍历 的进去就可以了
#include <stdio.h>
#include <stdlib.h>
/*二叉树链式存储的头文件*/
typedef char datatype;         /*结点属性值的类型*/
typedef struct node{           /*二叉树结点的类型*/
  datatype  data;
  struct node  *lchild,*rchild;
}bintnode,*bintree;


bintree createbintree()
{/*按照前序遍历的顺序建立一棵给定的二叉树*/
 char ch;
 bintree t;
 if ((ch=getchar())=='#')
      t=NULL;
 else {
          t=(bintnode *)malloc(sizeof(bintnode));
          t->data=ch;
          t->lchild=createbintree();
          t->rchild=createbintree();
       }
    return t;
 }


void preorder(bintree t)
  { /*前序遍历二叉树的递归算法*/
    if (t) { 
             printf("%c",t->data);       /*根左右*/
                         preorder(t->lchild);
                 preorder(t->rchild);
             }
     }


void inorder(bintree t)
  { /*中序遍历二叉树的递归算法*/
    if (t) { 
                         inorder(t->lchild);    /*左根右*/
                         printf("%c",t->data);
                 inorder(t->rchild);
             }
     }


void postorder(bintree t)
  { /*后序遍历二叉树的递归算法*/
    if (t) { 
             postorder(t->lchild);         /*左右根*/
                 postorder(t->rchild);
             printf("%c",t->data);
              }
     }


void main()
  { bintree root;    /*自定义*/
    
    printf("请输入二叉树的结点值:");  root=createbintree();   /*上面的输入二叉树的函数建二叉树*/
    
    printf("二叉树的前序遍历结果为:");  preorder(root);
    
    printf("\n二叉树的中序遍历结果为:");  inorder(root);
    
    printf("\n二叉树的后序遍历结果为:");  postorder(root);
 }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-17 13:14:59 | 显示全部楼层
这种作业好像上学期我都做了那时候我也像你一样急啊哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-17 13:22:37 | 显示全部楼层    本楼为最佳答案   
这是前中后序的,你自己看一下算法,自己加一个层次遍历 的进去就可以了
#include <stdio.h>
#include <stdlib.h>
/*二叉树链式存储的头文件*/
typedef char datatype;         /*结点属性值的类型*/
typedef struct node{           /*二叉树结点的类型*/
  datatype  data;
  struct node  *lchild,*rchild;
}bintnode,*bintree;


bintree createbintree()
{/*按照前序遍历的顺序建立一棵给定的二叉树*/
 char ch;
 bintree t;
 if ((ch=getchar())=='#')
      t=NULL;
 else {
          t=(bintnode *)malloc(sizeof(bintnode));
          t->data=ch;
          t->lchild=createbintree();
          t->rchild=createbintree();
       }
    return t;
 }


void preorder(bintree t)
  { /*前序遍历二叉树的递归算法*/
    if (t) { 
             printf("%c",t->data);       /*根左右*/
                         preorder(t->lchild);
                 preorder(t->rchild);
             }
     }


void inorder(bintree t)
  { /*中序遍历二叉树的递归算法*/
    if (t) { 
                         inorder(t->lchild);    /*左根右*/
                         printf("%c",t->data);
                 inorder(t->rchild);
             }
     }


void postorder(bintree t)
  { /*后序遍历二叉树的递归算法*/
    if (t) { 
             postorder(t->lchild);         /*左右根*/
                 postorder(t->rchild);
             printf("%c",t->data);
              }
     }


void main()
  { bintree root;    /*自定义*/
    
    printf("请输入二叉树的结点值:");  root=createbintree();   /*上面的输入二叉树的函数建二叉树*/
    
    printf("二叉树的前序遍历结果为:");  preorder(root);
    
    printf("\n二叉树的中序遍历结果为:");  inorder(root);
    
    printf("\n二叉树的后序遍历结果为:");  postorder(root);
 }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-17 13:25:04 | 显示全部楼层
你加油 好像我没看到你代码抱歉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-17 15:12:14 | 显示全部楼层
Gacy 发表于 2021-10-17 13:22
这是前中后序的,你自己看一下算法,自己加一个层次遍历 的进去就可以了

太太太感谢了,但我还想知道层次遍历以及输出根结点该怎么表示,书上没看到有相关代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-17 15:13:34 | 显示全部楼层
要不我找找??上学期的事了,不知道还有没有
基础的书上肯定有啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-17 15:17:44 | 显示全部楼层
Gacy 发表于 2021-10-17 15:13
要不我找找??上学期的事了,不知道还有没有
基础的书上肯定有啊

好的,我确实翻了好多遍二叉树相关的页码,没有有前中后序的代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-17 15:21:45 | 显示全部楼层
你看看对你有没有用
void levelorder(tree t)    /*树的层次遍历,t为指向树根结点的指针*/
    {  tree queue[100];        /*存放等待访问的结点队列*/
       int f,r,i;            /*f、r分别为队头、队尾指针*/
       tree p;
       f=0; r=1; queue[0]=t;
       while(f<r)      /*队列不为空*/
        {p=queue[f]; f++; printf("%c",p->data);  /*访问队头元素*/
         for(i=0;i<m;i++)   /*将刚被访问的元素的所有子女结点依次进队*/
           if(p->child[i])
            {queue[r]=p->child[i];  r++;}
         }
     }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-17 15:28:18 | 显示全部楼层
小菜鸡溜溜达 发表于 2021-10-17 15:17
好的,我确实翻了好多遍二叉树相关的页码,没有有前中后序的代码

我怎么印象中书上是有的呢拜拜了我先看教资去了有空再来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 15:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表