数据结构第六章一二次作业
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
上机题
(1)编写完整程序,用先序遍历法建立二叉树的二叉链
表存储结构。输出该二叉树的先、中、后序遍历结
点访问次序以及层次遍历结点访问次序。(建议结
点数据域类型为char)
// erchashu.cpp : Defines the entry point for the console application. //
#include "stdafx.h"
#include
#include
typedef struct node
{
char data;
struct node *lchild, *rchild;
}*BiT, BiTNode;
BiT crtBT()
{
char ch;
BiT bt;
ch=getchar();
if(ch=='#')
return NULL;
bt=new BiTNode();
bt->data=ch;
bt->lchild=crtBT();
bt->rchild=crtBT();
return bt;
}
void preorder(BiT bt)
{
if(bt)
{
printf("%c",bt->data);
preorder(bt->lchild);
preorder(bt->rchild);
}
//printf("\n");
}
void midorder(BiT bt)
{
if(bt)
{
midorder(bt->lchild);
printf("%c",bt->data);
midorder(bt->rchild);
}
//printf("\n");
}
void lasorder(BiT bt)
{
if(bt)
{
lasorder(bt->lchild);
lasorder(bt->rchild);
printf("%c",bt->data);
}
//printf("\n");
}
int main(int argc, char* argv[])
{
BiT bt;
bt=crtBT();
preorder(bt);
printf("\n");
midorder(bt);
printf("\n");
lasorder(bt);
printf("\n");
return 0;
}
(2)从键盘输入n个数据建立n元完全二叉树顺序存储结
构。实现该完全二叉树的先、中、后序遍历。#include "stdafx.h"
#include
#include
void preorder(int j,int i,char *s) {
if (j>i) return;
printf("%c",s[j]);
preorder(j*2+1,i,s);
preorder(j*2+2,i,s);
}
void midorder(int j,int i,char *s) {
if (j>i) return;
preorder(j*2+1,i,s);
printf("%c",s[j]);
preorder(j*2+2,i,s);
}
void lasorder(int j,int i,char *s) {
if (j>i) return;
preorder(j*2+1,i,s);
preorder(j*2+2,i,s);
printf("%c",s[j]);
}
int main(int argc, char* argv[])
{
int i=0;
char *bt;
char s[100];
scanf("%s",s);
bt=s;
while(s[i]!=0)
{
i++;
}
//printf("%d\n",i);
preorder(0,i,bt);
printf("\n");
midorder(0,i,bt);
printf("\n");
lasorder(0,i,bt);
printf("\n");
return 0;
}
算法
(1)已知二叉树(二叉链表)根结点指针为bt,求该二叉树中的叶子数目。
int preorder(BiT bt)
{
int k=0;
if(bt)
{
if(!bt->lchild&&!bt->rchild) k++;
preorder(bt->lchild);
preorder(bt->rchild);
}
return k;
}
(2)已知某二叉树(三叉链表)的根结点地址root,该树中各结点的左、右儿子指针域已正确填充,写一
个算法将所有结点的双亲指针域正确填充。
void preorder(BiT bt)
{
if(bt==root) return ;
if(bt)
{
bt->lchild->parent=bt;
bt->rchild->parent=bt;
preorder(bt->lchild);
preorder(bt->rchild);
}
}
(3)已知某二叉树(二叉链表)的根结点指针bt。编写算法,将该二叉树中所有结点的左右子树互换。
void preorder(BiT bt)
{
char c;
if(bt)
{
c=bt->lchild;
bt->lchild=bt->rchild;
bt->rchild=c;
preorder(bt->lchild);
preorder(bt->rchild);
}