第6章习题及解答

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

本章解答只给出算法描述,1~10题略。

算法中二叉树的二叉存储结构描述如下:

typedef struct BTNode{

datatype data;

struct BTNode *lchild,*rchild;

}BTNode ,*BiTree;

⒈对于下图所示二叉树,试给出:

⑴它的顺序存储结构示意图;

⑵它的二叉链表存储结构示意图;

⑶它的三叉链表存储结构示意。

⒉证明:在结点数多于1的哈夫曼树中不存在度为1的结

点。

⒊证明:若哈夫曼树中有n 个叶结点,则树中共有2n -1

个结点。

⒋证明:由二叉树的前序序列和中序序列可以唯一地确定

一棵二叉树。

⒌已知一棵度为m 的树中有n1个度为1的结点,n2个度

为2的结点,……,nm 个度为m 的结点,问该树中共有多少个

叶子结点?有多少个非终端结点?

⒍设高度为h 的二叉树上只有度为0和度为2的结点,问

该二叉树的结点数可能达到的最大值和最小值。 ⒎求表达式(a +b*(c -d ))-e/f 的波兰式(前缀式)和逆波兰式(后缀式)。

⒏画出和下列已知序列对应的二叉树:

二叉树的先序次序访问序列为:GFKDAIEBCHJ ;

二叉树的中序访问次序为:DIAEKFCJHBG 。

⒐画出和下列已知序列对应的二叉树:

二叉树的后序次序访问序列为:CFEGDBJLKIHA ;

二叉树的中序访问次序为:CBEFDGAJIKLH 。

⒑画出和下列已知序列对应的二叉树:

二叉树的层次序列为:ABCDEFGHIJ ;

二叉树的中序次序为:DBGEHJACIF 。

⒒给定一棵用二叉表示的二叉树,其根指针为root 。试写出求二叉树结点的数目的算法(递归算法或非递归算法)。

int count (BiTree t)

{

if (t= =NULL)

return (0);

else

return (count(t->lchild)+count(t->rchild)+1);

( 1题图)

}

⒓请设计一个算法,要求该算法把二叉树的叶结点按从左至右的顺序链成一个单链表。二叉树按lchild-rchild方式存储,链接时用叶结点的rchild域存放链指针。

void childLink(BiTree t, BiTree *L, BTNode *rear)

{

if (t)

{

if (t->lchild= =NULL && t->rchild= =NULL)

if (rear= =NULL)

{

*L=t;

rear=t;

}

else

{

rear->rchild=t;

rear=t;

}

childLink(t->lcild);

childLink(t->rchild);

}

return(L);

}

⒔给定一棵用链表表示的二叉树,其根结点root。试写出求二叉树的深度的算法。

int high(BiTree t)

{

if (t= =NULL)

return(0);

hl=high(t->lchild);

hr=high(t->rchild);

return(max(hl,hr)+1);

}

⒕给定一棵用链表表示的二叉树,其根指针为root。试写出求二叉树各结点的层数的算法。void fun(BiTree t, int n)

{

if (t= =NULL)

return;

else

{

cout<data<<”层次为:”<

fun(t->lchild,n+1);

fun(t->rchild,n+1);

}

}

⒖给定一棵用链表表示的二叉树,其根指针为root。试写出将二叉树中所有结点的左、右子树相互交换的算法。

void process (BiTree t )

{

if (t= =NULL)

return;

process(t->lchild);

process(t->rchild);

t->lchild<=>t->rchild;

return;

}

⒗一棵n个结点的完全二叉树以向量作为存储结构,试设计非递归算法对该完全二叉树进行前序遍历。void PreOrder (datatype data[n+1]) /*0号单元未用*/

{

int stack[n] ;

int top;

if (n<1)

return;

t=1;

top=0;

while (t<=n||top>0)

{

while (t<=n)

{

Visite(data[t]);

stack[top]=t;

top++;

t=t*2;

}

if (top<=0)

return;

else

{

top--;

t=stack[top];

t=t*2+1;

}

}

return;

}

⒘在二叉树中查找值为x的结点,试设计打印值为x 的结点的所有祖先结点算法。void printnode (BiTree t, datatype x)

{

init_Stack(s);

p=t;

while (p|| !Empty_Stack(s))

{

while (p)

{

if (p->data= =x)

{

while (!Empty_Stack(s))

{

pop(s,q);

cout<data<

}

return;

}

else

{

Push(s,p);

}

p=p->lchild;

相关文档
最新文档