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