求大佬们救救孩子,数据结构作业就要交了,很急很急
实验内容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;
front = rear = 0;
BiTNode *p;
rear = (rear+1) % maxSize;
que = T;
while(front != rear)
{
p = que;
//Visit(p); //我该怎么定义这个visit函数呢?
if(p->lchild != NULL)
{
rear = (rear+1) % maxSize;
que = p->lchild;
}
if(p->rchild != NULL)
{
rear = (rear+1) % maxSize;
que = 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);
// }
// }
//}
//先序遍历
voidPreOrderTraverse(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;
}
这种作业好像上学期我都做了{:10_254:}那时候我也像你一样急啊哈哈{:10_266:} 这是前中后序的,你自己看一下算法,自己加一个层次遍历 的进去就可以了
#include <stdio.h>
#include <stdlib.h>
/*二叉树链式存储的头文件*/
typedef char datatype; /*结点属性值的类型*/
typedef struct node{ /*二叉树结点的类型*/
datatypedata;
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);
}
你加油 好像我没看到你代码抱歉{:10_254:} Gacy 发表于 2021-10-17 13:22
这是前中后序的,你自己看一下算法,自己加一个层次遍历 的进去就可以了
太太太感谢了,但我还想知道层次遍历以及输出根结点该怎么表示,书上没看到有相关代码{:5_92:} 要不我找找??上学期的事了,不知道还有没有
基础的书上肯定有啊 Gacy 发表于 2021-10-17 15:13
要不我找找??上学期的事了,不知道还有没有
基础的书上肯定有啊
好的,我确实翻了好多遍二叉树相关的页码,没有{:5_96:}有前中后序的代码 你看看对你有没有用{:10_266:}
void levelorder(tree t) /*树的层次遍历,t为指向树根结点的指针*/
{tree queue; /*存放等待访问的结点队列*/
int f,r,i; /*f、r分别为队头、队尾指针*/
tree p;
f=0; r=1; queue=t;
while(f<r) /*队列不为空*/
{p=queue; f++; printf("%c",p->data);/*访问队头元素*/
for(i=0;i<m;i++) /*将刚被访问的元素的所有子女结点依次进队*/
if(p->child)
{queue=p->child;r++;}
}
} 小菜鸡溜溜达 发表于 2021-10-17 15:17
好的,我确实翻了好多遍二叉树相关的页码,没有有前中后序的代码
我怎么印象中书上是有的呢{:10_254:}拜拜了我先看教资去了{:10_266:}有空再来
页:
[1]