实验3 二叉树的遍历
来源:互联网 发布:如何拍淘宝图片 编辑:程序博客网 时间:2024/05/16 14:42
【实验内容】
创建一个二叉树,对这棵动态二叉树进行分析,将其用静态二叉链表表示。二叉树的动态二叉链表结构中的每个结点有三个字段:data,lchild,rchild。静态二叉链表是用数组作为存储空间,每个数组元素存储二叉树的一个结点,也有三个字段:data,lchild,rchild。lchild和rdhild分别用于存储左右孩子的下标。
【实验目的】
1、了解二叉树的前序、中序、后序和层次序列排列;
2、将C语言同二叉树的数据结构联系起来;
3、掌握生成的二叉树的链表结构;
4、掌握如何按层次输出二叉树的所有结点;
5、掌握如何将动态二叉树转换为静态二叉链表。
【实验步骤与要求】
1、实验前的准备
(1)了解二叉树的基本概念;
(2)了解二叉树的基本结构。
2、上机操作
(3)了解二叉树的前序和中序序列排列;
(4)将C语言同二叉树的数据结构联系起来;
(5)掌握生成的二叉树的链表结构;
(6)掌握如何按层次输出二叉树的所有结点;
(7)掌握如何将动态二叉树转换为静态二叉链表。
代码:
#include<stdio.h>#include<string.h>#include<stdlib.h>typedef struct tree{ struct tree *lchild,*rchild; int data;}Tree;int num[105],dnum[105],maxdeep;//num[i]表示第i层一共的节点个数,dnum[i]表示当前第i层的下标应该从dnum[i]开始放Tree* Build(Tree* p,int deep){ int x; scanf("%d",&x); if(x!=0)//输入0代表节点为空,输入的为前序遍历 { if(deep>maxdeep)//maxdeep记录下最高层 maxdeep=deep; p=malloc(sizeof(Tree)); p->data=x; num[deep]++;//deep层数节点数++ p->lchild=Build(p->lchild,deep+1); p->rchild=Build(p->rchild,deep+1); return p; } else return NULL;}void bianli(Tree *p)//中序遍历{ if(p!=NULL) { bianli(p->lchild); printf("%d ",p->data); bianli(p->rchild); }}typedef struct stree//静态树{ int data; int lchild,rchild;}Stree;Stree t[1005];int d;void translate(Stree t[],Tree *p,int parent,int tag,int deep)//按照层次遍历的标号来将动态树转化为静态树{ if(p!=NULL)//tag为0即该节点为左儿子,为1为右儿子,deep为当前层数,parent为父亲标号,用于修改父亲的儿子情况 { int pos=dnum[deep];//该节点放的位置 dnum[deep]++;//该层下一个放的时候放在后一个 t[pos].data=p->data; t[pos].lchild=0;//先初始化为0 t[pos].rchild=0; if(tag==0)//该节点为左儿子,修改父节点儿子情况 t[parent].lchild=pos; else//同上 t[parent].rchild=pos; translate(t,p->lchild,pos,0,deep+1);//继续遍历树,deep+1 translate(t,p->rchild,pos,1,deep+1); }}int main(){ int i,n,s=0; memset(num,0,sizeof(num));//每一层的节点数要初始化 Tree *head; maxdeep=0;//最大层数初始化 head=Build(head,1); for(i=1;i<=maxdeep;i++)//处理每一层应该从几开始放 { dnum[i]=s+1; s+=num[i]; }//处理完后一个有s个节点 printf("中序遍历:\n"); bianli(head); printf("\n"); d=1; translate(t,head,0,0,1); printf("转化为静态树后的层次遍历:\n"); for(i=1;i<=s;i++)//遍历静态树 { printf("%d lson:%d rson:%d\n",t[i].data,t[t[i].lchild].data,t[t[i].rchild].data); } printf("\n"); return 0;}
阅读全文
0 0
- 实验3 二叉树的遍历
- 数据结构实验之二叉树的遍历
- 二叉树的遍历:数据结构实验之二叉树二:遍历二叉树
- [C++ 二叉树的构建与遍历] 数据结构实验之二叉树二:遍历二叉树
- 设计性实验一 二叉树的遍历
- 数据结构实验(严蔚敏版)二叉树的建立与遍历
- [C++]数据结构实验05:二叉树的遍历
- 数据结构实验之二叉树的建立与遍历
- 实验六 二叉树的递归遍历及其应用
- 数据结构实验之二叉树的建立与遍历
- 数据结构实验之二叉树的建立与遍历
- 数据结构实验之二叉树的建立与遍历
- 数据结构实验之二叉树的建立与遍历
- 2136 数据结构实验之二叉树的建立与遍历
- 2136 数据结构实验之二叉树的建立与遍历
- 数据结构实验之二叉树的建立与遍历
- 数据结构实验之二叉树的建立与遍历
- 数据结构实验之二叉树的建立与遍历
- ORA-29786: SIHA attribute GET failed with error
- 递归实现 满二叉树的节点数计算
- 计算机网络作业四
- JAVA NIO 读写文件
- python中datetime与str的互相转化
- 实验3 二叉树的遍历
- Mac平台基于Eclipse使用OpenCV Java
- 内存分析工具 MyEclipse MAT Memory Analyzer Tool 插件安装
- QT控件大全二VirtualKeyboard
- 更换pip源到国内镜像
- zookeeper单节点安装和伪分布式集群安装
- 迷宫问题---深度搜索(dfs)
- 【备忘】深度学习入门视频课程上篇+下篇 下载
- JS/jQuery--iframe框架内外元素的操作