2585 - 数据结构/二叉树/创建与遍历(软件1、2)
<span style="font-size:9pt;">实验原理:</span><span style="font-family:Tahoma;font-size:9pt;"></span>
<span style="font-size:9pt;"> 二叉树是最重要的一类树型结构,而二叉链表是二叉树的一种比较直观和灵活的存储结构。在二叉链表中的每个结点由三部分组成:左孩子指针、右孩子指针和结点数据。</span><span style="font-family:Tahoma;font-size:9pt;"></span>
<span style="font-size:9pt;"> 其中左右孩子指针分别指向本结点的左右孩子结点,如果一个结点的左右孩子不存在,则对应的指针记录为空值,</span><span style="font-family:Tahoma;font-size:9pt;">C</span><span style="font-size:9pt;">语言用</span><span style="font-family:Tahoma;font-size:9pt;">NULL</span><span style="font-size:9pt;">表示,画图时用</span><span style="font-family:Tahoma;font-size:9pt;">^</span><span style="font-size:9pt;">表示。</span><span style="font-family:Tahoma;font-size:9pt;"></span>
<span style="font-size:9pt;"> 结点数据的数据类型应该根据实际应用进行选择,在本次实验中,选用字符类型。</span><span style="font-family:Tahoma;font-size:9pt;"></span>
<span style="font-family:Tahoma;font-size:9pt;"> </span>
<span style="font-size:9pt;"> 输入创建原理:</span><span style="font-family:Tahoma;font-size:9pt;"></span>
<span style="font-size:9pt;"> 创建二叉树可以用递归方式进行,下面用伪代码来描述创建流程:</span><span style="font-family:Tahoma;font-size:9pt;"></span>
<span style="font-size:9pt;"> 1、结点</span><span style="font-family:Tahoma;font-size:9pt;">* </span><span style="font-size:9pt;">创建结点函数</span><span style="font-family:Tahoma;font-size:9pt;">(){</span>
<span style="font-family:Tahoma;font-size:9pt;"> </span><span style="font-size:9pt;">定义结点数据</span><span style="font-family:Tahoma;font-size:9pt;">;</span>
<span style="font-size:9pt;"> 输入结点数据</span><span style="font-family:Tahoma;font-size:9pt;">;</span>
<span style="font-size:9pt;"> 如果 结点数据为空 则返回</span><span style="font-family:Tahoma;font-size:9pt;">NULL;//</span><span style="font-size:9pt;">规定输入字符</span><span style="font-family:Tahoma;font-size:9pt;">^</span><span style="font-size:9pt;">表示本结点不创建</span><span style="font-family:Tahoma;font-size:9pt;"></span>
<span style="font-size:9pt;"> 创建结点</span><span style="font-family:Tahoma;font-size:9pt;">* node;</span>
<span style="font-size:9pt;"> 赋值</span><span style="font-family:Tahoma;font-size:9pt;">node</span><span style="font-size:9pt;">的数据为刚刚输入的结点数据</span><span style="font-family:Tahoma;font-size:9pt;">;</span>
<span style="font-size:9pt;"> </span><span style="font-family:Tahoma;font-size:9pt;">node.</span><span style="font-size:9pt;">左孩子</span><span style="font-family:Tahoma;font-size:9pt;">=</span><span style="font-size:9pt;">创建结点函数</span><span style="font-family:Tahoma;font-size:9pt;">();</span>
<span style="font-size:9pt;"> </span><span style="font-family:Tahoma;font-size:9pt;">node.</span><span style="font-size:9pt;">右孩子</span><span style="font-family:Tahoma;font-size:9pt;">=</span><span style="font-size:9pt;">创建结点函数</span><span style="font-family:Tahoma;font-size:9pt;">();</span>
<span style="font-size:9pt;"> 返回</span><span style="font-family:Tahoma;font-size:9pt;"> node;</span>
<span style="font-family:Tahoma;font-size:9pt;"> }</span>
<span style="font-size:9pt;"> 2、在需要创建整棵二叉树的地方写上:</span><span style="font-family:Tahoma;font-size:9pt;"></span>
<span style="font-size:9pt;"> 二叉树根结点 = 创建结点函数</span><span style="font-family:Tahoma;font-size:9pt;">()</span><span style="font-size:9pt;">;</span><span style="font-family:Tahoma;font-size:9pt;"></span>
<span style="font-family:Tahoma;font-size:9pt;"> </span><span style="font-size:9pt;"> </span><span style="font-family:Tahoma;font-size:9pt;"> </span><span style="font-size:9pt;">遍历原理:要自己描述先序遍历、中序遍历原理。</span>
<span style="font-family:Tahoma;font-size:9pt;"> </span>
<span style="font-size:9pt;">实验步骤:</span><span style="font-family:Tahoma;font-size:9pt;"></span>
<span style="font-size:9pt;"> 1、定义二叉链表结点类型;</span><span style="font-family:Tahoma;font-size:9pt;"></span>
<span style="font-size:9pt;"> 2、实现二叉链表创建方法;</span><span style="font-family:Tahoma;font-size:9pt;"></span>
<span style="font-size:9pt;"> 3、实现二叉链表的先序、中序遍历方法;</span><span style="font-family:Tahoma;font-size:9pt;"></span>
<span style="font-size:9pt;"> 4、实现主函数</span><span style="font-family:Tahoma;font-size:9pt;"></span>
题目输入
<span style="font-size:9pt;"><span style="font-family:Tahoma;font-size:9pt;">
<span style="font-size:9pt;">每行一棵非空的二叉树,每棵二叉树按先序遍历形式,空指针用字符</span><span style="font-family:Tahoma;font-size:9pt;">^</span><span style="font-size:9pt;">占位,如图的一棵二叉树。</span><span style="font-family:Tahoma;font-size:9pt;"></span>
<span style="font-size:9pt;">如果读到一行的第一个字符就是</span><span style="font-family:Tahoma;font-size:9pt;">^</span><span style="font-size:9pt;">,表示没有更多输入了,程序退出。</span><span style="font-family:Tahoma;font-size:9pt;"></span>
<span style="font-size:9pt;">测试时,每棵树不会超过</span><span style="font-family:Tahoma;font-size:9pt;">20</span><span style="font-size:9pt;">个结点。</span><span style="font-family:Tahoma;font-size:9pt;"></span>
<span style="font-family:Tahoma;font-size:9pt;"></span>
<span style="font-size:9pt;">输入是:</span><span style="font-family:Tahoma;font-size:9pt;"></span>
<span style="font-family:Tahoma;font-size:9pt;">AB^DE^^^C^^</span>
<span style="font-family:Tahoma;font-size:9pt;">^</span>
<span style="font-family:Tahoma;font-size:9pt;"><span style="font-family:Tahoma;font-size:9pt;"> <span style="font-family:Tahoma;font-size:9pt;"> </span></span></span></span></span><span style="font-family:Tahoma;font-size:9pt;"></span>
题目输出
<span style="font-size:9pt;">对于每个二叉树,分别进行先序遍历、中序遍历,每种遍历结果输出一行。</span><span style="font-family:Tahoma;font-size:9pt;"></span>
<span></span>
输入/输出样例
题目输入
DL^^R^^ AB^DE^^^C^^ ^
题目输出
DLR LDR ABDEC BEDAC
提示
1、主函数可以采用以下流程
int main(){
定义结点指针;
do{
结点指针=创建结点函数();
if (结点指针非空){
先序遍历;换行
中序遍历;换行
}
}while(结点指针非空);
return 0;
}
2、
如果不采用一次输入一行字符串处理其中每个字符,而是采用每次输入一个字符处理,需要略过空白换行等字符,如下:
char ch;
do{
scanf("%c",&ch);
}while(ch<=32);//确保读到一个非空白非换行的字符
C语言解答
#include "stdio.h" #include "string.h" struct node { char key; int left; int right; int father; }; struct node tree[100000]; int head,sum; void xianxu(int n) { if (n==-1) return; if (n==0) return; if (n>0) printf("%c",tree[n].key); if (tree[n].left>=0) xianxu(tree[n].left); if (tree[n].right>=0) xianxu(tree[n].right); } void zhongxu(int n) { if (n==-1) return; if (n==0) return; if (tree[n].left>=0) zhongxu(tree[n].left); if (n>0) printf("%c",tree[n].key); if (tree[n].right>=0) zhongxu(tree[n].right); } int insert(int n,char key) { if (n==-1) { sum++; head=sum; tree[head].father=0; tree[head].left=-1; tree[head].right=-1; tree[head].key=key; return(1); } if (tree[n].left==-1) { if (key=='^') tree[n].left=0; else { sum++; tree[n].left=sum; tree[sum].father=n; tree[sum].left=-1; tree[sum].right=-1; tree[sum].key=key; } return(1); } if ((tree[n].left>0) &&(insert(tree[n].left,key)==1)) return; if (tree[n].right==-1) { if (key=='^') tree[n].right=0; else { sum++; tree[n].right=sum; tree[sum].father=n; tree[sum].left=-1; tree[sum].right=-1; tree[sum].key=key; } return(1); } if ((tree[n].right>0) &&(insert(tree[n].right,key)==1)) return; } void main() { int i; char str[100]; gets(str); while (1) { sum=0; head=-1; for (i=0;i<strlen(str);i++) { insert(head,str[i]); } xianxu(head); printf("\n"); zhongxu(head); printf("\n"); gets(str); if ((str[0]=='^')&&(strlen(str)==1)) break; } }
C++解答
#include <stdio.h> #include <malloc.h> typedef struct BiTNode{ char data; struct BiTNode *lchild,*rchild; }BitNode, *BiTree; BiTree CreateBiTree() { char da; BiTree T; do{ scanf("%c",&da); }while(da<=32); if(da == '^')T=NULL; else{ T=(BiTree)malloc(sizeof(BiTNode)); T->data=da; T->lchild=CreateBiTree(); T->rchild=CreateBiTree(); } return T; } 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); } } int main(){ BiTree btree; do{ btree=CreateBiTree(); if(btree!=NULL){ PreOrderTraverse(btree); printf("\n"); InOrderTraverse(btree); printf("\n"); } }while(btree!=NULL); return 0; }
提示
1、主函数可以采用以下流程
int main(){
定义结点指针;
do{
结点指针=创建结点函数();
if (结点指针非空){
先序遍历;换行
中序遍历;换行
}
}while(结点指针非空);
return 0;
}
2、
如果不采用一次输入一行字符串处理其中每个字符,而是采用每次输入一个字符处理,需要略过空白换行等字符,如下:
char ch;
do{
scanf("%c",&ch);
}while(ch<=32);//确保读到一个非空白非换行的字符