一、选择题
1.A 2.C 3.C 4.A 5.D 6.A 7.D 8.C 9.D 10.D
二、填空题
三、判断题
- √ 2. √ 3.× 4. √ 5. × 6. √ 7. √ 8. × 9. √ 10. ×
四、简答题
-
答案如下:
-
采用前序和后序两个序列来判断二叉树上结点 B 必定是结点 F 的祖先。
在前序序列中某结点的祖先都排在其前。若结点 B 是 F 的祖先,则 B必定在 F 之前。
而在后序序列中,某结点的祖先排在其后,即若结点 B 是 F 的祖先,则 B 必在 F 之后。
根据这条规则来判断若结点 B 在前序序列中在 F 之前,在后序序列中又在 F 之后,则它必是结点 F 的祖先 -
树的孩子兄弟链表表示法和二叉树二叉链表表示法,本质是一样的,只是解释不同,
也就是说树(树是森林的特例,即森林中只有一棵树的特殊情况)可用二叉树唯一表示,并可使用二叉树的一些算法去解决树和森林中的问题。
树和二叉树的区别有三:一是二叉树的度至多为 2,树无此限制;
二是二叉树有左右子树之分,即使在只有一个分枝的情况下, 也必须指出是左子树还是右子树,树无此限制;
三是二叉树允许为空,树一般不允许为空(个别书上允许为空) -
在后续线索二叉树中,若节点*p有右线索,则右线索为后继节点;否则,*p节点的后继节点为其双亲节点右子树中最左下的叶子节点。
五、计算题
- 代码如下:
int LeafNum(CSTree& T)
{
if(T){
if(!T->firstchild)
return 1+LeafNum(T->nextsibling);
else
return LeafNum(T->firstchild)+LeafNum(T->nextsibling);
}
else
return 0;
}
- //n 个结点的完全二叉树存于一维数组 A 中,本算法据此建立以二叉链表表示的完全二
叉树
BiTree Creat(ElemType A[], int i)
{
BiTree tree;
if (i<=n)
{
tree=(BiTree)malloc( sizeof(BiNode));
tree->element=A[i];
if(2*i>n)
{
tree->lchild=NULL;
}
else
{
tree->lchild=Creat(A,2*i);
}
if(2*i+1>n)
{
tree->rchild=NULL;
}
else
{
tree->rchild=Creat(A,2*i+1);
}
}
return (tree);
}//Creat
- (1)//删除二叉树代码如下:
Status DelBTree(BiTree& T)
{
if(T)
{
DelBTree(T->lchild);
DelBTree(T->rchild);
delete T;
return OK;
}
else
return ERROR;
}
(2) //求二叉树中度为1的节点个数
int NumberOfOneDegree(BTNode *T)//求二叉树中度为1的节点个数
{
int i=0;
if(NULL != T)
{
if((NULL!=T->lchild && NULL==T->rchild) ||(NULL!=T->rchild && NULL ==T->lchild))
{
i=1+NumberOfOneDegree(T->lchild)+NumberOfOneDegree(T->rchild);
}
else
{
i=NumberOfOneDegree(T->lchild)+NumberOfOneDegree(T->rchild);
}
}
return i;
}
(3) // 按先序交换二叉树的左右子树
Status ExchangeBiTree(BiTree& T)
{
BiTree p;
if(T){
p=T->lchild;
T->lchild=T->rchild;
T->rchild=p;
ExchangeBiTree(T->lchild);
ExchangeBiTree(T->rchild);
}
return OK;
}
- 解析如下:
- 解析如下:
六、说明
本人已毕业多年,读研时撰写了一份 《数据结构与算法分析(C++语言版)_张琨版 课后习题答案》,每年依旧有大量考研的学弟学妹们来找这份答案,现将其公布在blog上,仅供学术交流,上述解答如有问题,可私信沟通。