数据结构第六章一二次作业

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

}

相关文档
最新文档