假设二叉树根节点的层次为0,一棵深度(高度)为k的满二叉树和同样深度的完全二叉树各有f个节点和c
假设二叉树根节点的层次为0,一棵深度(高度)为k的满二叉树和同样深度的完全二叉树各有f个节点和c个节点,下列关系式不正确的是
A.f≥)c
B.c>f
C.f=2的k-1次幂减1
D.c大于2的A次幂减1
假设二叉树根节点的层次为0,一棵深度(高度)为k的满二叉树和同样深度的完全二叉树各有f个节点和c个节点,下列关系式不正确的是
A.f≥)c
B.c>f
C.f=2的k-1次幂减1
D.c大于2的A次幂减1
设二叉树根结点的层次编号为1,则深度为k的完全二叉树有(31)种。
A.2k
B.2k-1
C.2(k-1)
D.2k
如果一棵有n个结点的满二叉树的深度为d(树根所在的层次为1),则给出推导式:
(1)用深度d表达其结点总数n。
(2)用结点总数n表达深度d.
(3)若对该树的结点从1开始按中序遍历次序进行编号,则树根结点的编号如何用d表示?树根结点的左子女结点的编号如何用d表示?右子女结点的编号如何用d表示?
A.1
B.n1+n2
C.n3
D.n2+n3
A.2m+l
B.2m-1
C.2(m-1)
D.2m
阅读以下说明和C语言函数,将应填入(n)处的字句写在对应栏内。
【说明】
下面的程序构造一棵以二叉链表为存储结构的二叉树算法。
【函数】
BTCHINALR *createbt (BTCHINALR *bt )
{
BTCHINALR *q;
struct node1 *s [30];
int j,i;
char x;
printf ("i,x =" ); scanf ("%d,%c",&i,&x );
while (i!=0 && x!='$')
{ q = (BTCHINALR* malloc (sizeof (BTCHINALR )); //生成一个结点
(1);
q->1child = NULL;
q->rchild = NULL;
(2);
if((3);)
{j=i/2 //j为i的双亲结点
if(i%2==0
(4) //i为j的左孩子
else
(5) //i为j的右孩子
}
printf ("i,x =" ); scanf ("%d,%c",&i,&x ); }
return s[1]
}
试题四
阅读下列函数说明和C函数,将应填入 (n) 处的字句写在答题纸的对应栏内。
[函数说明]
函数DeleteNode(Bitree *r,int e)的功能是:在树根结点指针为r的二叉查找(排序)树上删除键值为e的结点,若删除成功,则函数返回0,否则函数返回-1。二叉查找树结点的类型定义为:
typedef struct Tnode{
int data;
struct Tnode *Lchild,*Rchild;
}*Bitree;
在二叉查找树上删除一个结点时,要考虑三种情况:
1若待删除的结点p是叶子结点,则直接删除该结点;
2若待删除的结点p只有一个子结点,则将这个子结点与待删除结点的父结点直接连接,然后删除结点p;
3若待删除的结点p有两个子结点,则在其左子树上,用中序遍历寻找关键值最大的结点s,用结点s的值代替结点p的值,然后删除结点s,结点s必属于上述1、2情况之一。
[函数代码]
int DeleteNode(Bitree *r,int e) {
Bitreep = *r, pp, s, c;
while((1) ) { /*从树根结点出发查找键值为e的结点*/
pp = p;
if (e< p->data) p = p -> Lchild;
else p = p->Rchild;
}
if(!p) return –1; /* 查找失败 */
if(p->Lchild && p->Rchild) { /* 处理情况3 */
s = (2);pp = p;
while ((3) ) { pp = s; s = s-> Rchild; }
p->data = s ->data; p = s;
}
/*处理情况1、2*/
if((4) ) c = p -> Lchild;
elsec = p -> Rchild;
if(p == *r) *r = c;
elseif ((5) ) pp -> Lchild = c;
elsepp->Rchild = c;
free(p);
return 0;
}