|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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;
- }
复制代码
这是前中后序的,你自己看一下算法,自己加一个层次遍历 的进去就可以了
- #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);
- }
复制代码
|
|