(完整版)数据结构 - c语言描述(第二版)答案 - 耿国华 - 西安电子科技大学 下载本文

6.16分别写出算法,实现在中序线索二叉树T中查找给定结点*p在中序序列中的前驱与后继。在先序线索二叉树T中,查找给定结点*p在先序序列中的后继。在后序线索二叉树T中,查找给定结点*p在后序序列中的前驱。

(1)找结点的中序前驱结点

BiTNode *InPre (BiTNode *p)

/*在中序线索二叉树中查找p的中序前驱结点,并用pre指针返回结果*/ { if (p->Ltag= =1) pre = p->LChild; /*直接利用线索*/ else

{/*在p的左子树中查找“最右下端”结点*/

for ( q=p->LChild; q->Rtag= =0; q=q->RChild); pre = q; }

return (pre); }

(2)找结点的中序后继结点

BiTNode *InSucc (BiTNode *p)

/*在中序线索二叉树中查找p的中序后继结点,并用succ指针返回结果*/ { if (p->Rtag= =1) succ = p->RChild; /*直接利用线索*/

else

{/*在p的右子树中查找“最左下端”结点*/ for ( q=p->RChild; q->Ltag= =0; q=q->LChild); succ= q;

13

}

return (succ); }

(3) 找结点的先序后继结点

BiTNode *PreSucc (BiTNode *p)

/*在先序线索二叉树中查找p的先序后继结点,并用succ指针返回结果*/ { if (p->Ltag= =0) succ = p->LChild; else succ= p->RChild; return (succ); }

(4) 找结点的后序前驱结点

BiTNode *SuccPre (BiTNode *p)

/*在后序线索二叉树中查找p的后序前驱结点,并用pre指针返回结果*/ { if (p->Ltag= =1) pre = p->LChild; else pre= p->RChild; return (pre); }

6.20已知二叉树按照二叉链表方式存储,利用栈的基本操作写出先序遍历非递归形式的算法。 【解答】

Void PreOrder(BiTree root) /*先序遍历二叉树的非递归算法*/ {

InitStack(&S); p=root;

while(p!=NULL || !IsEmpty(S) ) { if(p!=NULL) {

Visit(p->data); push(&S,p); p=p->Lchild;

}

else {

Pop(&S,&p); p=p->RChild; } } }

6.26二叉树按照二叉链表方式存储,编写算法将二叉树左右子树进行交换。 【解答】 算法(一)

Void exchange ( BiTree root ) {

p=root; if ( p->LChild != NULL || p->RChild != NULL )

{

14

} }

算法(二) Void exchange ( BiTree root )

{

p=root; if ( p->LChild != NULL || p->RChild != NULL )

{

exchange ( p->LChild ); exchange ( p->RChild ); temp = p->LChild;

p->LChild = p->RChild;

p->RChild = temp; } }

第八章

temp = p->LChild;

p->LChild = p->RChild; p->RChild = temp;

exchange ( p->LChild ); exchange ( p->RChild );

第八章答案

8.1 【解答】 5

ASLsucc=(1+2X2+3X4+4X3)/10=2.9

8.5 【解答】

15

(1) ASLSUCC=(1+2 X2+3 X3+4X3+5X2+6)/12=3.5

(2) 排序为:Apr,Aug,Dec,Feb,Jan,July,June,Mar,May,Nov,Oct,Sep

折半查找ASLSUCC=(1+2 X2+3 X4+4X5)/12=37/12

8.12 【解答】

ASLSUCC=(1 X4+2 X3+6)/8=2

ASLUNSUCC=(2+1+8+7+6+5+4+3+2+1+1)/11=40/11

16