文档库 最新最全的文档下载
当前位置:文档库 › 《数据结构》习题汇编06 第六章 树和二叉树 试题

《数据结构》习题汇编06 第六章 树和二叉树 试题

《数据结构》习题汇编06 第六章 树和二叉树 试题
《数据结构》习题汇编06 第六章 树和二叉树 试题

第六章树与二叉树试题

一、单项选择题

1.树中所有结点的度等于所有结点数加( )。

A、 0

B、 1

C、 -1

D、 2

2.在一棵树中,( )没有前驱结点。

A、分支结点

B、叶结点

C、根结点

D、空结点

3.在一棵二叉树的二叉链表中,空指针域数等于非空指针域数加( )。

A、 2

B、 1

C、 0

D、 -1

4.在一棵具有n个结点的二叉树中,所有结点的空子树个数等于( )。

A、 n

B、 n-1

C、 n+1

D、 2*n

5.在一棵具有n个结点的二叉树的第i层上(假定根结点为第0层,i大于等于0而小于等于树的高度),

最多具有( )个结点。

A、 2i

B、 2i+1

C、 2i-1

D、 2n

6.在一棵高度为h(假定根结点的层号为0)的完全二叉树中,所含结点个数不小于( )。

A、 2h-1

B、 2h+1

C、 2h-1

D、 2h

7.在一棵具有35个结点的完全二叉树中,该树的高度为( )。假定空树的高度为-1。

A、 5

B、 6

C、 7

D、 8

8.在一棵具有n个结点的完全二叉树中,分支结点的最大编号为( )。假定树根结点的编号为0。

A、?(n-1)/2?

B、?n/2?

C、?n/2?

D、?n/2? -1

9.在一棵完全二叉树中,若编号为i的结点存在左孩子,则左子女结点的编号为( )。假定根结点的

编号为0

A、 2i

B、 2i-1

C、 2i+1

D、 2i+2

10.在一棵完全二叉树中,假定根结点的编号为0,则对于编号为i(i>0)的结点,其双亲结点的编号为

( )。

A、?(i+1)/2?

B、?(i-1)/2?

C、?i/2?

D、?i/2? -1

11.在一棵树的左子女-右兄弟表示法中,一个结点的右孩子就是该结点的( )结点。

A、兄弟

B、子女

C、祖先

D、子孙

12.在一棵树的静态双亲表示中,每个存储结点包含( )个域。

A、 1

B、 2

C、 3

D、 4

13.已知一棵二叉树的广义表表示为a (b (c), d (e ( , g (h) ), f ) ),则该二叉树的高度为( )。

A、 3

B、 4

C、 5

D、 6

14.已知一棵树的边集表示为 {, , , , , , ,

},则该树的高度为( )。假定根结点的高度为0。

A、 2

B、 3

C、 4

D、 5

15.利用n个值作为叶结点上的权值生成的霍夫曼树中共包含有( )个结点。

A、 n

B、 n+1

C、 2*n

D、 2*n-1

16.利用3, 6, 8, 12这四个值作为叶结点的权值生成一棵霍夫曼树,该树的带权路径长度为( )。

A、 55

B、 29

C、 58

D、 38

17.一棵树的广义表表示为a (b, c (e, f (g) ), d),当用左子女-右兄弟链表表示时,右指针域非

空的结点个数为( )。

A、 1

B、 2

C、 3

D、 4

18.向具有n个结点的堆中插入一个新元素的时间复杂度为( )。

A、 O(1)

B、 O(n)

C、 O(log2n)

D、 O(nlog2n)

参考答案:1、 C 2、 C 3、 A 4、 C 5、 A

6、 D

7、 A

8、 D

9、 C 10、 B

11、 A 12、 B 13、 B 14、 B 15、 D

16、 A 17、 C 18、 C

二、填空题

1.对于一棵具有n个结点的树,该树中所有结点的度数之与为______。

2.在一棵树中,______结点没有前驱结点。

3.在一棵树中,______结点没有后继结点。

4.一棵树的广义表表示为a (b (c, d (e, f), g (h) ), i (j, k (x, y) ) ),结点k的所

有祖先的结点数为______个。

5.一棵树的广义表表示为a (b (c, d (e, f), g (h) ), i (j, k (x, y) ) ),结点f的层

数为______。假定根结点的层数为0。

6.假定一棵三叉树(即度为3的树)的结点个数为50,则它的最小高度为______。假定根结点的高度为

0。

7.在一棵高度为3的四叉树中,最多含有______结点。

8.在一棵三叉树中,度为3的结点数有2个,度为2的结点数有1个,度为1的结点数为2个,那么度为

0的结点数有______个。

9.一棵高度为5的完全二叉树中,最多包含有______个结点。假定根结点的高度为0。

10.假定一棵树的广义表表示为A (B (C, D (E, F, G), H (I, J) ) ),则该树的高度为______。

假定根结点的高度为0。

11.在一棵二叉树中,假定度为2的结点个数为5个,度为1的结点个数为6个,则叶结点数为______个。

12.假定一棵二叉树的结点个数为18,则它的最小高度为______。假定根结点的高度为0。

13.在一棵高度为h的理想平衡树(即从0层到h-1层都就是满的,第h层的结点分布在该层各处)中,最

少含有______个结点。假定根结点的高度为0。

14.在一棵高度为h的理想平衡树(即从0层到h-1层都就是满的,第h层的结点分布在该层各处)中,最

多含有______个结点。假定根结点的高度为0。

15.若将一棵树A (B (C, D, E), F (G (H), I) ) 按照左子女-右兄弟表示法转换为二叉树,该二

叉树中度为2的结点个数为______个。

16.一棵树按照左子女-右兄弟表示法转换成对应的二叉树,则该二叉树中______结点肯定没有右子女。

17.在一个堆的顺序存储中,若一个元素的下标为i(0≤i≤n-1),则它的左子女元素的下标为______。

18.在一个堆的顺序存储中,若一个元素的下标为i(0≤i≤n-1),则它的右子女元素的下标为______。

19.在一个小根堆(即最小堆)中,堆顶结点的值就是所有结点中的______。

20.在一个大根堆(即最大堆)中,堆顶结点的值就是所有结点中的______。

21.6个结点可构造出________种不同形态的二叉树。

22.设森林F中有4棵树,第1、2、3、4棵树的结点个数分别为n1、n2、n3、n4,当把森林F转换成一

棵二叉树后,其根结点的右子树中有________个结点。

23.设森林F中有4棵树,第1、2、3、4棵树的结点个数分别为n1、n2、n3、n4,当把森林F转换成一

棵二叉树后,其根结点的左子树中有________个结点。

24.将含有82个结点的完全二叉树从根结点开始顺序编号,根结点为第0号,其她结点自上向下,同一层

自左向右连续编号。则第40号结点的双亲结点的编号为________。

参考答案:1、 n-1 2、树根3、叶子4、 2 5、 3

6、 4

7、 85

8、 6

9、 63 10、 3

11、 6 12、 4 13、 2h14、 2h+1-1 15、 2

16、根17、 2i+1 18、 2i+2 19、最小值20、最大值

21、 132 22、 n2+n3+n4 23、 n1-1 24、 19

1.当向一个小根堆(最小堆)中插入一个具有最小值的元素时,该元素需要逐层向上调整,直到被调整到

堆顶位置为止。

2.当从一个小根堆(最小堆)中删除一个元素时,需要把堆尾元素填补到堆顶位置,然后再按条件把它逐

层向下调整,直到调整到合适位置为止。

3.二叉树就是一棵无序树。

4.在一棵二叉树中,假定每个结点只有左子女,没有右子女,对它分别进行前序遍历与后序遍历,则具有

相同的遍历结果。

5.在一棵二叉树中,假定每个结点只有左子女,没有右子女,对它分别进行中序遍历与后序遍历,则具有

相同的遍历结果。

6.在一棵二叉树中,假定每个结点只有左子女,没有右子女,对它分别进行前序遍历与中序遍历,则具有

相同的遍历结果。

7.在一棵二叉树中,假定每个结点只有左子女,没有右子女,对它分别进行前序遍历与按层遍历,则具有

相同的遍历结果。

8.在树的存储中,若使每个结点带有指向前驱结点的指针,将在算法中为寻找前驱结点带来方便。

9.对于一棵具有n个结点,其高度为h的二叉树,进行任一种次序遍历的时间复杂度为O(n)。

10.对于一棵具有n个结点,其高度为h的二叉树,进行任一种次序遍历的时间复杂度为O(h)。

11.对于一棵具有n个结点的任何二叉树,进行前序、中序或后序的任一种次序遍历的空间复杂度为

O(log2n)。

12.在一棵具有n个结点的线索化二叉树中,每个结点的指针域可能指向子女结点,也可能作为线索,使之

指向某一种遍历次序的前驱或后继结点,所有结点中作为线索使用的指针域共有n个。

13.线索化二叉树中的每个结点通常包含有5个数据成员。

14.线索化二叉树中的每个结点通常包含有3个数据成员。

15.对具有n个结点的堆进行插入一个元素运算的时间复杂度为O(n)。

16.从具有n个结点的堆中删除一个元素,其时间复杂度为O(log2n)。

17.二叉树就是树的特殊情形。

18.若有一个结点就是二叉树中某个子树的中序遍历结果序列的最后一个结点,则它一定就是该子树的前

序遍历结果序列的最后一个结点。

19.若有一个结点就是二叉树中某个子树的前序遍历结果序列的最后一个结点,则它一定就是该子树的中

序遍历结果序列的最后一个结点。

20.若有一个叶子结点就是二叉树中某个子树的中序遍历结果序列的最后一个结点,则它一定就是该子树

的前序遍历结果序列的最后一个结点。

21.若有一个叶子结点就是二叉树中某个子树的前序遍历结果序列的最后一个结点,则它一定就是该子树

的中序遍历结果序列的最后一个结点。

22.若将一批杂乱无章的数据按堆结构组织起来, 则堆中各数据必然按自小到大的顺序排列起来。

参考答案:1、就是2、就是3、否4、否5、就是

6、否

7、就是

8、就是

9、就是10、

11、否12、否13、就是14、否15、否

16、就是17、就是18、否19、否20、就

21、否22、否

四、运算题

1.假定一棵二叉树的广义表表示为a (b (c), d (e, f) ),分别写出对它进行前序、中序、后序、

按层遍历的结果。

前序:__________________

中序:__________________

后序:__________________

按层:__________________

2.假定一棵二叉树的广义表表示为A (B ( , D (G) ), C (E, F) ),分别写出对它进行前序、中

序、后序、按层遍历的结果。

前序:__________________________

中序:__________________________

后序:__________________________

按层:__________________________

3.假定一棵普通树的广义表表示为a (b (e), c (f (h, i, j), g), d),分别写出先根、后根、

按层遍历的结果。

先根:__________________________

后根:__________________________

按层:__________________________

4.已知一棵二叉树的前序与中序序列,求该二叉树的后序序列。

前序序列:A, B, C, D, E, F, G, H, I, J

中序序列:C, B, A, E, F, D, I, H, J, G

后序序列:______________________

5.已知一棵二叉树的中序与后序序列如下,求该二叉树的前序序列。

中序序列:c, b, d, e, a, g, i, h, j, f

后序序列:c, e, d, b, i, j, h, g, f, a

前序序列:____________________

6.已知一棵二叉树的中序与后序序列如下,求该二叉树的高度(假定空树的高度为-1)与度为2、度为1

的结点及叶结点个数。

中根序列:c, b, d, e, a, g, i, h, j, f

后根序列:c, e, d, b, i, j, h, g, f, a

高度:________ 度为2:________ 度为1:________ 叶子:_________

7.已知一棵二叉树的静态数组表示(即顺序存储表示)如下,其中0表示空指针,请分别写出该二叉树的

前序、中序、后序遍历的序列。

0 1 2 3 4 5 6 7 8 9 10 11 12

前序序列:_________________________________

中序序列:_________________________________

后序序列:_________________________________

8.已知一棵树的静态双亲表示如下,其中用 -1表示空指针,树根结点存于0号单元,分别求出该树的叶

子结点数、单分支结点数、两分支结点数与三分支结点数。

序号: 0 1 2 3 4 5 6 7 8 9 10

叶子结点数: ____________

单分支结点数:____________

两分支结点数:____________

三分支结点数:____________

9.假定一个最大堆(大根堆)为(56, 38, 42, 30, 25, 40, 35, 20),则依次向它插入45与64两

个元素后得到的最大堆为:_________________________________

10.假定一个最小堆(小根堆)为(20, 35, 50, 57, 42, 70, 83, 65, 86),则依次从中删除三个最

小元素后得到的最小堆为:_________________________________

11.已知一组数为(56, 48, 25, 16, 74, 52, 83, 45),请把该组数调整为最小堆(即小根堆)。

最小堆:_________________________________

12.有7个带权结点,其权值分别为3, 7, 8, 2, 6, 10, 14,试以它们为叶结点生成一棵霍夫曼树,

求出该树的带权路径长度、高度、度为2的结点个数。

带权路径长度:____________

度为2的结点数:____________

13.设二叉树根结点所在层次为0,树的高度h为距离根最远的叶结点所在层次,则:

高度为h的完全二叉树的不同二叉树棵数:_____________

高度为h的满二叉树的不同二叉树棵数:_____________

14.确定满足以下条件的二叉树的可能形态:

二叉树的前序序列与中序序列相同:__________________________

二叉树的中序序列与后序序列相同:__________________________

二叉树的前序序列与后序序列相同:__________________________

参考答案:

1.前序:a, b, c, d, e, f //2分

中序:c, b, a, e, d, f //2分

后序:c, b, e, f, d, a //1分

按层:a, b, d, c, e, f //1分

2.前序:A, B, D, G, C, E, F //2分

中序:B, G, D, A, E, C, F //2分

后序:G, D, B, E, F, C, A //1分

按层:A, B, C, D, E, F, G //1分

3.先根:a, b, e, c, f, h, i, j, g, d //2分

后根:e, b, h, i, j, f, g, c, d, a //2分

按层:a, b, c, d, e, f, g, h, i, j //2分

4.后序序列:C, B, F, E, I, J, H, G, D, A //6分

5.前序序列:a, b, c, d, e, f, g, h, i, j //6分

6.高度:5 //2分

度为2:3 //2分

度为1:3 //1分

叶子:4 //1分

7.前序序列:20, 8, 5, 15, 10, 18, 46, 30, 35 //2分

中序序列:5, 8, 10, 15, 18, 20, 30, 35, 46 //2分

后序序列:5, 10, 18, 15, 8, 35, 30, 46, 20 //2分

8.叶子结点数: 5 //2分

单分支结点数:3 //2分

两分支结点数:2 //1分

三分支结点数:1 //1分

9.(64, 56, 42, 38, 45, 40, 35, 20, 30, 25) //6分

10.(50, 57, 70, 65, 86, 83) //6分

11.(16, 45, 25, 48, 74, 52, 83, 56) //6分

12.带权路径长度:131 //3分

高度:4 //2分

度为2的结点数:6 //1分

13.高度为h的完全二叉树的不同二叉树棵数:2h; //3分

高度为h的满二叉树的不同二叉树棵数:1; //3分

14.二叉树的前序序列与中序序列相同:所有结点的左子树为空; //2分

二叉树的中序序列与后序序列相同:所有结点的右子树为空; //2分

二叉树的前序序列与后序序列相同:只有一个结点,左右子树为空;//2分

五、算法分析题

1.已知二叉树中的结点类型用BinTreeNode表示,被定义为:

struct BinTreeNode { ElemType data;BinTreeNode *leftChild, *rightChild; };

其中data为结点值域,leftChild与rightChild分别为指向左、右子女结点的指针域。下面函数的功能就是返回二叉树BT中值为x的结点所在的层号,请在划有横线的地方填写合适的内容。

int NodeLevel ( BinTreeNode * BT, ElemType& x ) {

if ( BT == NULL ) return–1; //空树的层号为-1

else if ( BT->data == x ) return 0;//根结点的层号为0

else {

int c1 = NodeLevel ( BT->leftChild, x );//向子树中查找x结点

if ( c1 >= 0 ) _________(1)_________;

int c2 =_________(2)__________;

___________(3)____________;

else return -1;//在树中不存在x结点返回-1 }

}

(1) _____________________________________________

(2) _____________________________________________

(3) _____________________________________________

2.已知二叉树中的结点类型用BinTreeNode表示,被定义为:

struct BinTreeNode {

ElemType data;BinTreeNode *leftChild, *rightChild; };

其中data为结点值域,leftChild与rightChild分别为指向左、右子女结点的指针域。下面函数的功能就是从二叉树BT中查找值为x的结点,返回指向其父结点的指针。若该结点不存在或为树根结点则返回空。算法中参数PT的初值为NULL。请在划有横线的地方填写合适的内容。

BinTreeNode* ParentPtr ( BinTreeNode* BT, BinTreeNode* PT, ElemType& x ) { if ( BT == NULL ) return NULL;

else if ( BT->data == x ) return PT;

else {

if ( PT = ParentPtr ( BT->leftChild, BT, x ) ) _______(1)________;

________________________(2)________________________;

else _______(3)________;

}

}

(1) _____________________________________________

(2) _____________________________________________

(3) _____________________________________________

3.已知二叉树中的结点类型用BinTreeNode表示,被定义为:

struct BinTreeNode {

ElemType data;BinTreeNode *leftChild, *rightChild; };

其中data为结点值域,leftChild与rightChild分别为指向左、右子女结点的指针域。根据下面函数的定义指出函数的功能。算法中参数BT指向一棵二叉树的树根结点。

BinTreeNode* BinTreeSwopX ( BinTreeNode * BT ) {

if ( BT == NULL ) return NULL;

else {

BinTreeNode* pt = new BinTreeNode;

pt->data = BT->data;

pt->rightChild = BinTreeSwopX ( BT->leftChild );

pt->lefthild = BinTreeSwopX ( BT->rightChild );

return pt;

}

}

算法功能:___________________________________________________

4.已知二叉树中的结点类型用ThreeTreeNode表示,被定义为:

struct ThreeTreeNode {

datatype data; ThreeTreeNode *leftChild, *rightChild, *parent; };

其中data为结点值域,leftChild与rightChild分别为指向左、右子女结点的指针域,parent 为指向父结点的指针域。根据下面函数的定义指出函数的功能。算法中参数T指向一棵二叉树的树根结点,x保存一个结点的值。

ThreeTreeNode* PN ( ThreeTreeNode * T, datatype& x ) {

if ( T == NULL ) return NULL;

else {

ThreeTreeNode* mt;

if ( T->data == x ) return T->parent;

else if ( mt = PN ( T->rightChild, x ) ) return mt;

return NULL;

}

}

算法功能:__________________________________________________

5.已知二叉树中的结点类型用BinTreeNode表示,被定义为:

struct BinTreeNode {

ElemType data;BinTreeNode *leftChild, *rightChild; };

其中data为结点值域,leftChild与rightChild分别为指向左、右子女结点的指针域。根据下面函数的定义指出函数的功能。算法中参数BT指向一棵二叉树的根结点。

void BTC ( BinTreeNode* BT ) {

if ( BT != NULL ) {

if ( BT->leftChild != NULL && BT->rightChild != NULL )

if ( BT->leftChild->data > BT->rightChild->data ) {

BinTreeNode* t = BT->leftChild;

BT->leftChild = BT->rightchild;

BT->rightChild = t;

}

BTC ( BT->leftChild );

BTC ( BT->rightChild );

}

}

算法功能:_________________________________________________

6.已知二叉树中的结点类型用BinTreeNode表示,被定义为:

struct BinTreeNode {

char data; BinTreeNode *leftChild, *rightChild;};

其中data为结点值域,leftChild与rightChild分别为指向左、右子女结点的指针域。假定指针bt指向一棵二叉树,该二叉树的广义表表示为a (b (a, d (f) ), c (e ( , a (k) ), b) ),整数变量C的值为0,若:

(1) 执行BTC1( bt, ’a’, C ) 调用后,C的值为________;

(2) 执行BTC1( bt, ’b’, C ) 调用后,C的值为________;

(3) 执行BTC1( bt, ’c’, C) 调用后,C的值为________;

(4) 执行BTC1( bt, ’g’, C) 调用后,C的值为________;

void BTC1( BinTreeNode* BT, char x, int& k ) {

if ( BT != NULL ) {

if ( BT->data == x ) k++;

BTC1( BT->leftChild, x, k );

BTC1( BT->rightChild, x, k );

}

7.已知二叉树中的结点类型用BinTreeNode表示,被定义为:

struct BinTreeNode {

ElemType data;BinTreeNode * leftChild, * rightChild; };

其中data为结点值域,leftChild与rightChild分别为指向左、右子女结点的指针域。下面函数的功能就是从二叉树BT中查找值为x的结点,若查找成功则返回结点地址,否则返回空。请在划有横线的地方填写合适内容。

BinTreeNode* BTF ( BinTreeNode* BT, ElemType& x ) {

if ( BT == NULL ) _____(1)______;

else {

if ( BT->data == x ) _____(2)_____;

else {

BinTreeNode* t;

If ( t = BTF ( BT->leftChild, x ) ) _____(3)_____;

___________(4)___________;

else return NULL;

}

}

}

(1) _____________________________________________

(2) _____________________________________________

(3) _____________________________________________

(4) _____________________________________________

8.已知二叉树中的结点类型用BinTreeNode表示,被定义为:

struct BinTreeNode {

ElemType data; BinTreeNode *leftChild, *rightChild; };

其中data为结点值域,leftChild与rightChild分别为指向左、右子女结点的指针域。根据下面函数的定义指出函数的功能。算法中参数BT指向一棵二叉树的根结点。

int DST ( BinTreeNode*& BT, ElemType x ) {

if ( BT == NULL ) return 0;

else {

if ( BT->data == x ) { BT = NULL; return 1; }

else {

if ( DST ( BT->leftChild, x ) ) return 1;

if ( DST ( BT->rightChild, x ) ) return 1;

else return 0;

}

}

}

算法功能:_________________________________________________

9.已知二叉树中的结点类型用BinTreeNode表示,被定义为:

struct BinTreeNode { char data; BinTreeNode *leftChild, *rightChild; };

其中data为结点值域,leftChild与rightChild分别为指向左、右子女结点的指针域。假定一棵二叉树采用链接存储,它的广义表表示为r (b (, d (f, g) ), t (e) ),rt, bt, dt与et指针变量分别保存指向r, b, d与e结点的指针值,则:

(1)执行BTM (rt) 调用后,得到的函数值为________;

(2)执行BTM (bt) 调用后,得到的函数值为________;

(3)执行BTM (dt) 调用后,得到的函数值为________;

(4)执行BTM (et) 调用后,得到的函数值为________;

char BTM(BinTreeNode* BT) {

static char max = 0;

if ( BT != NULL ) {

char k1, k2;

k1 = BTM ( BT->leftChild );

k2 = BTM ( BT->rightChild );

if ( k1 > max ) max = k1;

else if ( k2 > max ) max = k2;

else if ( BT->data > max ) max = BT->data;

}

return max;

}

10.已知二叉树中的结点类型用BinTreeNode表示,被定义为:

struct BinTreeNode {

ElemType data;BinTreeNode *leftChild, *rightChild; };

其中data为结点值域,leftChild与rightChild分别为指向左、右子女结点的指针域。根据下面函数的定义指出函数的功能。算法中参数BT指向一棵二叉树的根结点。

void preserve ( BinTreeNode* BT, ElemType a[ ], int n ) {

static int i = 0;

if ( BT != NULL ) {

preserve ( BT->leftChild, a, n );

a[i++] = BT->data;

preserve ( BT->rightChild, a, n );

}

}

算法功能:__________________________________________________

11.假定在a[10]数组中数据为{ 16, 42, 35, 73, 54, 38, 80 },n为整型变量,其值为7,则执

行IH ( a, n, 25 ) 调用下面算法后数组a中的数据变为:_________________________

void IH ( int HBT[ ], int& n, int item ) {

HBT[n] = item;

int x = item;

int i = n-1;

while ( i != 0 ) {

int j = (i-1)/2;

if ( x >= HBT[j] ) break;

HBT[i] = HBT[j];

i = j;

}

HBT[i] = x;

}

12.假定在a[10]数组中数据为 {16, 35, 42, 73, 54, 68, 80, 26},n为整型变量,其值为8,

则执行DH ( a, n ) 调用下面算法后数组a中的数据变为:____________________________

int DH ( int HBT[ ], int& n ) {

if ( n == 0 ) { cerr << "null!" << endl; exit (1); }

int temp = HBT[0];

n--;

int x = HBT[n];

int i = 0, j = 2*i+1;

while ( j <= n-1 ) {

if ( j < n-1 && HBT[j] > HBT[j+1] ) j++;

if ( x <= HBT[j] ) break;

HBT[i] = HBT[j];

i = j; j = 2*i+1;

}

HBT[i] = x;

return temp;

}

参考答案:

1.(1) return c1+1 //2分

(2) NodeLevel ( BT->rightChild, X ) //3分

(3) if (c2 >= 0 ) return c2+1 //3分

2.(1) return PT //2分

(2) if ( PT = ParentPtr ( BT->rightChild, BT, X ) ) return PT //4分

(3) return NULL或return 0 //2分

3.算法功能:生成一棵新二叉树并返回树根指针,该二叉树就是已知二叉树BT中所有结点的左、右子树

交换的结果。

4.算法功能:从树根指针为T的二叉树中查找值为X的结点,返回指向父结点的指针。

5.算法功能:对二叉树BT进行处理,当BT中每个结点的左孩子的值大于右孩子的值则交换左右子树。

6.(1) 3 //2分

(2) 2 //2分

(3) 1 //2分

(4) 0 //2分

7.(1) return NULL //2分

(2) return BT //2分

(3) return t //2分

(4) if ( t = BTF ( BT->rightChild, x ) ) return t //2分

8.算法功能:从一棵二叉树中删除根结点值为x的子树,若删除成功则返回1,否则返回0。

9.(1) ’t’ //2分

(2) ’g’ //2分

(3) ’g’ //2分

(4) ’e’//2分

10.算法功能:对具有n个结点的二叉树进行中根遍历,把得到的结点值序列保存到数组a中。

11.{16, 25, 35, 42, 54, 38, 80, 73 }//有一处错则不得分

12.{26, 35, 42, 73, 54, 68, 80 }//有一处错则不得分

六、算法设计题

1.已知二叉树中的结点类型用BinTreeNode表示,被定义为:

struct BinTreeNode { char data;BinTreeNode *leftChild, *rightChild; };

其中data为结点值域,leftChild与rightChild分别为指向左、右子女结点的指针域,根据下面函数声明编写出求一棵二叉树高度的算法,该高度由函数返回。假定根结点的层次为0,参数BT初始指向这棵二叉树的根结点。

int BTreeHeight ( BinTreeNode* BT );

2.已知二叉树中的结点类型用BinTreeNode表示,被定义为:

struct BTreeNode { char data; BinTreeNode *leftChild, *rightChild; };

其中data为结点值域,leftChild与rightChild分别为指向左、右子女结点的指针域,根据下面函数声明编写出求一棵二叉树中结点总数的算法,该总数值由函数返回。假定参数BT初始指向这棵二叉树的根结点。

int BTreeCount ( BinTreeNode* BT );

3.已知二叉树中的结点类型用BinTreeNode表示,被定义为:

struct BinTreeNode { char data;BinTreeNode *leftChild, *rightChild; };

其中data为结点值域,leftChild与rightChild分别为指向左、右子女结点的指针域,根据下面函数声明编写出求一棵二叉树中叶子结点总数的算法,该总数值由函数返回。假定参数BT初始指向这棵二叉树的根结点。

int BTreeLeafCount ( BinTreeNode* BT );

4.已知二叉树中的结点类型用BinTreeNode表示,被定义为:

struct BinTreeNode { char data;BinTreeNode *leftChild, *rightChild; };

其中data为结点值域,leftChild与rightChild分别为指向左、右子女结点的指针域,根据下面函数声明编写出删除一棵二叉树中所有结点的算法,并使树根指针为空。假定引用参数BT初始指向这棵二叉树的根结点。

void ClearBinTree ( BinTreeNode*& BT);

5.已知二叉树中的结点类型用BinTreeNode表示,被定义为:

struc t BinTreeNode { char data; BinTreeNode *leftChild, *rightChild; };

其中data为结点值域,leftChild与rightChild分别为指向左、右子女结点的指针域,根据下面函数声明编写出判断两棵二叉树就是否相等的算法,若相等则返回1,否则返回0。算法中参数T1与T2为分别指向这两棵二叉树根结点的指针。当两棵树的结构完全相同并且对应结点的值相同时才被认为相等。

int BTreeEqual ( BinTreeNode* T1, BinTreeNode* T2 );

6.已知二叉树中的结点类型用BinTreeNode表示,被定义为:

struct BinTreeNode { char data;BinTreeNode *leftChild, *rightChild; };

其中data为结点值域,leftChild与rightChild分别为指向左、右子女结点的指针域,根据下面函数声明编写出交换一棵二叉树中所有结点的左、右指针域值的算法,算法中参数BT初始指向这棵二叉树的根结点。

void BTreeSwop ( BinTreeNode* BT );

7.已知二叉树中的结点类型用BinTreeNode表示,被定义为:

struct BinTreeNode { char data; BinTreeNode *leftChild, *rightChild; };

其中data为结点值域,leftChild与rightChild分别为指向左、右子女结点的指针域,根据下面函数声明编写出复制一棵二叉树的算法,并返回复制得到的二叉树的树根指针。算法中参数BT初始指向待复制二叉树的根结点。

BinTreeNode* BTreeCopy ( BinTreeNode* BT );

8.已知二叉树中的结点类型用BinTreeNode表示,被定义为:

struct BinTreeNode { char data;BinTreeNode *leftChild, *rightChild; };

其中data为结点值域,leftChild与rightChild分别为指向左、右子女结点的指针域,根据下面函数声明编写出从一棵二叉树中求出结点值大于x的结点个数的算法,并返回所求结果。算法中参数BT 初始指向二叉树的根结点。

int BTreeCount ( BinTreeNode* BT, ElemType x );

参考答案:

1.算法如下

int BTreeHeight ( BinTreeNode* BT ) {

if ( BT == NULL ) return –1;//对于空树,返回-1并结束递归,1分

else {

int h1 = BTreeHeight ( BT->leftChild );//计算左子树的高度,2分

int h2 = BTreeHeight (BT->rightChild ); //计算右子树的高度,2分

if ( h1 > h2 ) return h1+1;

else return h2+1; //返回树的高度,3分

}

2.算法如下

int BTreeCount ( BinTreeNode* BT ) {

if ( BT == NULL ) return 0;//2分

else

return BTreeCount ( BT->leftChild ) + BTreeCount ( BT->rightChild ) + 1;//6分

}

3.算法如下

int BTreeLeafCount ( BinTreeNode* BT ) {

if ( BT == NULL ) return 0;//1分

else if (BT->leftChild == NULL &&BT->rightChild == NULL)return1;

//3分

else return BTreeLeafCount ( BT->leftChild ) + BTreeLeafCount ( BT->rightChild );//4分

}

4.算法如下

void ClearBinTree ( BinTreeNode*& BT ) {

if ( BT!=NULL ) {//1分

ClearBinTree ( BT->leftChild );//递归删除左子树,2分

ClearBinTree ( BT->rightChild );//递归删除右子树,2分

delete BT;//回收根结点,2分

BT = NULL;//置根指针为空,1分}

}

5.算法如下

int BtreeEqual ( BinTreeNode* T1, BinTreeNode* T2) {

if ( T1 == NULL && T2 == NULL ) return 1;//若两棵树均为空则返回1,1分

else if ( T1 == NULL || T2 == NULL) return 0;//若一棵为空一棵不为空则返回0,2分

else if ( T1->data == T2->data &&

BTreeEqual ( T1->leftChild, T2->leftChild ) &&

BTreeEqual (T1->rightChild, T2->rightChild ) ) return 1;

//若根结点值相等并且左、右子树对应相等则两棵树相等,3分else return 0; //若根结点值不等或左、右子树对应不等则两棵树不等,2分}

6.算法如下

void BTreeSwop ( BinTreeNode* BT ) {

if ( BT != NULL ) {//1分

BinTreeNode* pt = BT->leftChild;

BT->leftChild = BT->rightChild;

BT->rightChild = pt; //交换左右子女指针域的值,3分

BtreeSwop ( BT->leftChild );//对左子树进行同样处理,2分

BtreeSwop ( BT->rightChild );//对右子树进行同样处理,2分}

}

7.算法如下

BinTreeNode* BtreeCopy ( BinTreeNode* BT ) {

if ( BT == NULL ) return NULL;//1分

else {

BinTreeNode* pt = new BinTreeNode;//得到新结点,1分

pt->data = BT->data;//复制根结点值,1分

pt->leftChild = BtreeCopy ( BT->leftChild );//复制左子树,2分

pt->rightChild = BTreeCopy ( BT->rightChild ); //复制右子树,2分

return pt;//返回新树的树根指针,1分}

}

8.算法如下

//统计出二叉树中大于给定值x的结点个数,该统计值由函数返回

int BtreeCount ( BinTreeNode* BT, ElemType x ) {

if ( BT == NULL ) return 0; //1分

else if ( BT->data > x )

return BtreeCount(BT->leftChild, x) + BtreeCount(BT->rightChild, x) + 1;

//4分

else

return BtreeCount ( BT->leftChild, x ) + BtreeCount ( BT->rightChild, x );

//3分

}

数据结构二叉树实验报告

实验三二叉树的遍历 一、实验目的 1、熟悉二叉树的结点类型和二叉树的基本操作。 2、掌握二叉树的前序、中序和后序遍历的算法。 3、加深对二叉树的理解,逐步培养解决实际问题的编程能力。 二、实验环境 运行C或VC++的微机。 三、实验内容 1、依次输入元素值,以链表方式建立二叉树,并输出结点的值。 2、分别以前序、中序和后序遍历二叉树的方式输出结点内容。 四、设计思路 1. 对于这道题,我的设计思路是先做好各个分部函数,然后在主函数中进行顺序排列,以此完成实验要求 2.二叉树采用动态数组 3.二叉树运用9个函数,主要有主函数、构建空二叉树函数、建立二叉树函数、访问节点函数、销毁二叉树函数、先序函数、中序函数、后序函数、范例函数,关键在于访问节点 五、程序代码 #include #include #include #define OK 1 #define ERROR 0 typedef struct TNode//结构体定义 {

int data; //数据域 struct TNode *lchild,*rchild; // 指针域包括左右孩子指针 }TNode,*Tree; void CreateT(Tree *T)//创建二叉树按,依次输入二叉树中结点的值 { int a; scanf("%d",&a); if(a==00) // 结点的值为空 *T=NULL; else // 结点的值不为空 { *T=(Tree)malloc(sizeof(TNode)); if(!T) { printf("分配空间失败!!TAT"); exit(ERROR); } (*T)->data=a; CreateT(&((*T)->lchild)); // 递归调用函数,构造左子树 CreateT(&((*T)->rchild)); // 递归调用函数,构造右子树 } } void InitT(Tree *T)//构建空二叉树 { T=NULL; } void DestroyT(Tree *T)//销毁二叉树 { if(*T) // 二叉树非空 { DestroyT(&((*T)->lchild)); // 递归调用函数,销毁左子树 DestroyT(&((*T)->rchild)); // 递归调用函数,销毁右子树 free(T); T=NULL; } } void visit(int e)//访问结点 { printf("%d ",e); }

二叉树习题及答案

1.设一棵完全二叉树共有699 个结点,则在该二叉树中的叶子结点数? 1根据二叉树的第i层至多有2A(i - 1)个结点;深度为k的二叉树至多有2A k - 1 个结点(根结点的深度为1)”这个性质: 因为2A9-1 < 699 < 2A10-1 , 所以这个完全二叉树的深度是10,前9 层是一个满二叉树, 这样的话,前九层的结点就有2A9-1=511 个;而第九层的结点数是2A(9-1)=256 所以第十层的叶子结点数是699-511=188 个;现在来算第九层的叶子结点个数。由于第十层的叶子结点是从第九层延伸的,所以应该去掉第九层中还有子树的结点。因为第十层有188 个,所以应该去掉第九层中的188/2=94 个;所以,第九层的叶子结点个数是256-94=162,加上第十层有188 个,最后结果是350 个 2完全二叉树:若二叉树中最多只有最下面两层的结点的度可以小于2,并且最下面一层的结点 (叶结点) 都依次排列在该层最左边的位置上,这样的二叉树为完全二叉树。 比如图:完全二叉树除叶结点层外的所有结点数(叶结点层以上所有结点数)为奇数,此题中,699 是奇数,叶结点层以上的所有结点数为保证是奇数,则叶结点数必是偶数,这样我们可以立即选出答案为B!如果完全二叉树的叶结点都排满了,则是满二叉树,易得满二叉树的叶结点数是其以上所有层结点数+1 比如图: 此题的其实是一棵满二叉树,我们根据以上性质,699+1=700,700/2=350,即叶结点数为350,叶结点层以上所有结点数为350-1=349。 3完全二叉树中,只存在度为2 的结点和度为0 的结点,而二叉树的性质中有一条是: nO=n2+1 ; nO指度为0的结点,即叶子结点,n2指度为2的结点,所以2n2+1=699 n2=349 ; n0=350 2.在一棵二叉树上第 5 层的结点数最多是多少一棵二叉树,如果每个结点都是是满的,那么会满足2A(k-1)1 。所以第5 层至多有2A(5-1)=16 个结点! 3.在深度为5 的满二叉树中,叶子结点的个数为答案是16 ~ 叶子结点就是没有后件的结点~ 说白了~ 就是二叉树的最后一层~ 深度为K 的二叉树~ 最多有2Ak-1 个结点~ 最多有2A(k-1) 个结点~ 所以此题~ 最多有2A5-1=31 个结点~ 最多有2A(5-1)=16 个叶子结点~ 4.某二叉树中度为2 的结点有18 个,则该二叉树中有几个叶子结点?结点的度是指树中每个结点具有的子树个数或者说是后继结点数。 题中的度为2 是说具有的2 个子树的结点;二叉树有个性质:二叉树上叶子结点数等于度为2 的结点数加1。 5.在深度为7 的满二叉树中,度为2 的结点个数为多少,就是第一层只有一个节点,他有两个子节点,第二层有两个节点,他们也都有两个子节点以此类推,所以到第6 层,就有2的5次方个节点,他们都有两个子节点最后第7 层都没有子节点了。因为是深度为7 的。 所以就是1+2+4+8+16+32 了 2深度为1的时候有0个 深度为2的时候有1个 深度为3的时候有3个 深度为4的时候有7个 深度为n的时候有(2的n-1次方减1 )个 6?—棵二叉树中共有70个叶子结点与80个度为1的结点,则该二叉树中的总结点数为?

树和二叉树习题数据结构

习题六树和二叉树一、单项选择题 1.以下说法错误的是 ( ) A.树形结构的特点是一个结点可以有多个直接前趋B.线性结构中的一个结点至多只有一个直接后继 C.树形结构可以表达(组织)更复杂的数据 D.树(及一切树形结构)是一种"分支层次"结构 E.任何只含一个结点的集合是一棵树 2.下列说法中正确的是 ( ) A.任何一棵二叉树中至少有一个结点的度为2 B.任何一棵二叉树中每个结点的度都为2 C.任何一棵二叉树中的度肯定等于2 D.任何一棵二叉树中的度可以小于2 3.讨论树、森林和二叉树的关系,目的是为了()A.借助二叉树上的运算方法去实现对树的一些运算B.将树、森林按二叉树的存储方式进行存储

C.将树、森林转换成二叉树 D.体现一种技巧,没有什么实际意义 4.树最适合用来表示 ( ) A.有序数据元素 B.无序数据元素 C.元素之间具有分支层次关系的数据 D.元素之间无联系的数据5.若一棵二叉树具有10个度为2的结点,5个度为1的结点,则度为0的结点个数是()A.9 B.11 C.15 D.不确定 6.设森林F中有三棵树,第一,第二,第三棵树的结点个数分别为M1,M2和M3。与森林F对应的二叉树根结点的右子树上的结点个数是()。 A.M1 B.M1+M2 C.M3 D.M2+M3 7.一棵完全二叉树上有1001个结点,其中叶子结点的个数是() A. 250 B. 500 C.254 D.505 E.以上答案都不对 8. 设给定权值总数有n 个,其哈夫曼树的结点总数为( ) A.不确定 B.2n C.2n+1 D.2n-1 9.二叉树的第I层上最多含有结点数为() A.2I B. 2I-1-1 C. 2I-1 D.2I -1

数据结构第六章树和二叉树习题及答案

习题六树和二叉树 一、单项选择题 1.以下说法错误的是() A. 树形结构的特点是一个结点可以有多个直接前趋 B. 线性结构中的一个结点至多只有一个直接后继 C. 树形结构可以表达(组织)更复杂的数据 D. 树(及一切树形结构)是一种”分支层次”结构 E. 任何只含一个结点的集合是一棵树 2. 下列说法中正确的是() A. 任何一棵二叉树中至少有一个结点的度为2 B. 任何一棵二叉树中每个结点的度都为2 C. 任何一棵二叉树中的度肯定等于2 D. 任何一棵二叉树中的度可以小于2 3. 讨论树、森林和二叉树的关系,目的是为了() A. 借助二叉树上的运算方法去实现对树的一些运算 B. 将树、森林按二叉树的存储方式进行存储 C. 将树、森林转换成二叉树 D. 体现一种技巧,没有什么实际意义4.树最适合用来表示() A. 有序数据元素 B .无序数据元素 C.元素之间具有分支层次关系的数据 D .元素之间无联系的数据 5.若一棵二叉树具有10个度为2的结点,5个度为1的结点,则度为0的结点个数是()A.9 B .11 C .15 D .不确定 6. 设森林F中有三棵树,第一,第二,第三棵树的结点个数分别为M1, M2和M3与森林F 对应的二叉树根结点的右子树上的结点个数是()。 A.M1 B .M1+M2 C .M3 D .M2+M3 7.一棵完全二叉树上有1001个结点,其中叶子结点的个数是() A.250 B .500 C .254 D .505 E .以上答案都不对 8. 设给定权值总数有n 个,其哈夫曼树的结点总数为() A. 不确定 B . 2n C . 2n+1 D . 2n-1 9.二叉树的第I 层上最多含有结点数为() I I-1 I-1 I A.2I B .2 I-1 -1 C .2 I-1 D .2 I -1 10.一棵二叉树高度为h, 所有结点的度或为0,或为2,则这棵二叉树最少有()结点A.2h B .2h-1 C .2h+1 D .h+1 11. 利用二叉链表存储树,则根结点的右指针是()。 A.指向最左孩子 B .指向最右孩子 C .空D .非空 12.已知一棵二叉树的前序遍历结果为为()。 A.CBEFDA B .FEDCBA 13.已知某二叉树的后序遍历序列是()。 ABCDEF中序遍历结果 为 C .CBEDFA D dabec, 中序遍历序列是 CBAEDF则后序遍历的结 果 .不定 debac , 它的前序遍历是

数据结构树和二叉树习题

树与二叉树 一.选择题 1.假定在一棵二叉树中,双分支结点数为15,单分支结点数为30个,则叶子结 点数为()个。 A.15B.16C.17D.47 2.按照二叉树的定义,具有3个结点的不同形状的二叉树有()种。 A. 3 B. 4 C. 5 D. 6 3.按照二叉树的定义,具有3个不同数据结点的不同的二叉树有()种。 A. 5 B. 6 C. 30 D. 32 4.深度为5的二叉树至多有()个结点。1 A. 16 B. 32 C. 31 D. 10 5.设高度为h的二叉树上只有度为0和度为2的结点,则此类二叉树中所包含的 结点数至少为()。 A. 2h B. 2h-1 C. 2h+1 D. h+1 6.对一个满二叉树2,m个树叶,n个结点,深度为h,则()。 A. n=h+m3 B. h+m=2n C. m=h-1 D. n=2 h-1 1深度为n的二叉树结点至多有2n-1 2满二叉树是除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树7.任何一棵二叉树的叶结点在先序.中序和后序遍历序列中的相对次序()。 A.不发生改变 B.发生改变 C.不能确定 D.以上都不对 8.如果某二叉树的前根次序遍历结果为stuwv,中序遍历为uwtvs,那么该二叉 树的后序为()。 A. uwvts B. vwuts C. wuvts D. wutsv 9.某二叉树的前序遍历结点访问顺序是abdgcefh,中序遍历的结点访问顺序是 dgbaechf,则其后序遍历的结点访问顺序是()。 A. bdgcefha B. gdbecfha C. bdgaechf D. gdbehfca 10.在一非空二叉树的中序遍历序列中,根结点的右边()。 A. 只有右子树上的所有结点 B. 只有右子树上的部分结点 C. 只有左子树上的部分结点 D. 只有左子树上的所有结点 11.树的基本遍历策略可分为先根遍历和后根遍历;二叉树的基本遍历策略可分为 先序遍历.中序遍历和后序遍历。这里,我们把由树转化得到的二叉树4叫做这棵数对应的二叉树。结论()是正确的。 A.树的先根遍历序列与其对应的二叉树的先序遍历序列相同 B.树的后根遍历序列与其对应的二叉树的后序遍历序列相同 3对于深度为h的满二叉树,n=20+21+…+2h-1=2h-1,m=2h-1。故而n=h+m。 4树转化为二叉树的基本方法是把所有兄弟结点都用线连起来,然后去掉双亲到子女的连线,只留下双亲到第一个子女的连线。因此原来的兄弟关系就变为双亲与右孩子的关系。 1/ 9

《数据结构》习题汇编06第六章树和二叉树试题

第六章树和二叉树试题 一、单项选择题 1.树中所有结点的度等于所有结点数加()。 A. 0 B. 1 C. -1 D. 2 2.在一棵树中,()没有前驱结点。 A. 分支结点 B. 叶结点 C. 根结点 D. 空结点 3.在一棵二叉树的二叉链表中,空指针域数等于非空指针域数加()。 A. 2 B. 1 C. 0 D. -1 4.在一棵具有n个结点的二叉树中,所有结点的空子树个数等于()。 A. n B. n-1 C. n+1 D. 2*n 5.在一棵具有n个结点的二叉树的第i层上(假定根结点为第0层,i大于等

于0而小于等于树的高度),最多具有()个结点。 A. 2i B. 2i+1 C. 2i-1 D. 2n 6.在一棵高度为h(假定根结点的层号为0)的完全二叉树中,所含结点个数不 小于()。 A. 2h-1 B. 2h+1 C. 2h-1 D. 2h 7.在一棵具有35个结点的完全二叉树中,该树的高度为()。假定空树 的高度为-1。 A. 5 B. 6 C. 7 D. 8 8.在一棵具有n个结点的完全二叉树中,分支结点的最大编号为()。假 定树根结点的编号为0。 A. ?(n-1)/2? B. ?n/2? C. ?n/2? D. ?n/2? -1 9.在一棵完全二叉树中,若编号为i的结点存在左孩子,则左子女结点的编号 为()。假定根结点的编号为0

A. 2i B. 2i-1 C. 2i+1 D. 2i+2 10.在一棵完全二叉树中,假定根结点的编号为0,则对于编号为i(i>0)的结 点,其双亲结点的编号为()。 A. ?(i+1)/2? B. ?(i-1)/2? C. ?i/2? D. ?i/2? -1 11.在一棵树的左子女-右兄弟表示法中,一个结点的右孩子是该结点的() 结点。 A. 兄弟 B. 子女 C. 祖先 D. 子孙 12.在一棵树的静态双亲表示中,每个存储结点包含()个域。 A. 1 B. 2 C. 3 D. 4 13.已知一棵二叉树的广义表表示为a (b (c), d (e ( , g (h) ), f ) ),则 该二叉树的高度为()。假定根结点的高度为0。 A. 3 B. 4 C. 5 D. 6

数据结构实验报告-二叉树的实现与遍历

《数据结构》第六次实验报告 学生姓名 学生班级 学生学号 指导老师

一、实验内容 1) 采用二叉树链表作为存储结构,完成二叉树的建立,先序、中序和后序 以及按层次遍历的操作,求所有叶子及结点总数的操作。 2) 输出树的深度,最大元,最小元。 二、需求分析 遍历二叉树首先有三种方法,即先序遍历,中序遍历和后序遍历。 递归方法比较简单,首先获得结点指针如果指针不为空,且有左子,从左子递归到下一层,如果没有左子,从右子递归到下一层,如果指针为空,则结束一层递归调用。直到递归全部结束。 下面重点来讲述非递归方法: 首先介绍先序遍历: 先序遍历的顺序是根左右,也就是说先访问根结点然后访问其左子再然后访问其右子。具体算法实现如下:如果结点的指针不为空,结点指针入栈,输出相应结点的数据,同时指针指向其左子,如果结点的指针为空,表示左子树访问结束,栈顶结点指针出栈,指针指向其右子,对其右子树进行访问,如此循环,直至结点指针和栈均为空时,遍历结束。 再次介绍中序遍历: 中序遍历的顺序是左根右,中序遍历和先序遍历思想差不多,只是打印顺序稍有变化。具体实现算法如下:如果结点指针不为空,结点入栈,指针指向其左子,如果指针为空,表示左子树访问完成,则栈顶结点指针出栈,并输出相应结点的数据,同时指针指向其右子,对其右子树进行访问。如此循环直至结点指针和栈均为空,遍历结束。 最后介绍后序遍历: 后序遍历的顺序是左右根,后序遍历是比较难的一种,首先需要建立两个栈,一个用来存放结点的指针,另一个存放标志位,也是首先访问根结点,如果结点的指针不为空,根结点入栈,与之对应的标志位也随之入标志位栈,并赋值0,表示该结点的右子还没有访问,指针指向该结点的左子,如果结点指针为空,表示左子访问完成,父结点出栈,与之对应的标志位也随之出栈,如果相应的标志位值为0,表示右子树还没有访问,指针指向其右子,父结点再次入栈,与之对应的标志位也入栈,但要给标志位赋值为1,表示右子访问过。如果相应的标志位值为1,表示右子树已经访问完成,此时要输出相应结点的数据,同时将结点指针赋值为空,如此循环直至结点指针和栈均为空,遍历结束。 三、详细设计 源代码:

数据结构实验-二叉树的操作

******************************* 实验题目:二叉树的操作 实验者信息:班级13007102,姓名庞文正,学号1300710226 实验完成的时间3:00 ****************************** 一、实验目的 1,掌握二叉树链表的结构和二叉树的建立过程。 2,掌握队列的先进先出的运算原则在解决实际问题中的应用。 3,进一步掌握指针变量、指针数组、动态变量的含义。 4,掌握递归程序设计的特点和编程方法。 二、实验内容 已知以二叉链表作存储结构,试编写按层次遍历二叉树的算法。(所谓层次遍历,是指从二叉树的根结点开始从上到下逐层遍历二叉树,在同一层次中从左到右依次访问各个节点。)调试程序并对相应的输出作出分析;修改输入数据,预期输出并验证输出的结果。加深对算法的理解。 三、算法设计与编码 1.本实验用到的理论知识 总结本实验用到的理论知识,实现理论与实践相结合。总结尽量简明扼要,并与本次实验密切相关,最好能加上自己的解释。 本算法要采用一个循环队列que,先将二叉树根结点入队列,然后退队列,输出该结点;若它有左子树,便将左子树根结点入队列;若它有右子树,便将右子树根结点入队列,直到队列空为止。因为队列的特点是先进先出,从而达到按层次顺序遍历二叉的目的。2.算法概要设计 给出实验的数据结构描述,程序模块、功能及调用关系 #include #include #define M 100 typedef struct node //二叉链表节点结构 {int data; //数据域 struct node *lchild,*rchild; //左孩子右孩子链 }bitree; bitree *que[M]; //定义一个指针数组,说明队列中的元素bitree 指针类型 int front=0, rear=0; //初始化循环列队 bitree *creat() //建立二叉树的递归算法 {bitree *t; int x; scanf("%d",&x); if(x==0) t=NULL; //以x=0 表示输入结束 else {t=malloc(sizeof(bitree)); //动态生成节点t,分别给节点t 的数据域,t->data=x; //左右孩子域赋值,给左右孩子赋值时用到 t->lchild=creat(); // 了递归思想 t->rchild=creat(); }

各类型二叉树例题说明

5.1树的概念 树的递归定义如下:(1)至少有一个结点(称为根)(2)其它是互不相交的子树 1.树的度——也即是宽度,简单地说,就是结点的分支数。以组成该树各结点中最大的度作为该树的度,如上图的树,其度为3;树中度为零的结点称为叶结点或终端结点。树中度不为零的结点称为分枝结点或非终端结点。除根结点外的分枝结点统称为内部结点。 2.树的深度——组成该树各结点的最大层次,如上图,其深度为4; 3.森林——指若干棵互不相交的树的集合,如上图,去掉根结点A,其原来的二棵子树T1、T2、T3的集合{T1,T2,T3}就为森林; 4.有序树——指树中同层结点从左到右有次序排列,它们之间的次序不能互换,这样的树称为有序树,否则称为无序树。 5.树的表示 树的表示方法有许多,常用的方法是用括号:先将根结点放入一对圆括号中,然后把它的子树由左至右的顺序放入括号中,而对子树也采用同样的方法处理;同层子树与它的根结点用圆括号括起来,同层子树之间用逗号隔开,最后用闭括号括起来。如上图可写成如下形式: (A(B(E(K,L),F),C(G),D(H(M),I,J))) 5. 2 二叉树 1.二叉树的基本形态: 二叉树也是递归定义的,其结点有左右子树之分,逻辑上二叉树有五种基本形态: (1)空二叉树——(a); (2)只有一个根结点的二叉树——(b); (3)右子树为空的二叉树——(c); (4)左子树为空的二叉树——(d); (5)完全二叉树——(e) 注意:尽管二叉树与树有许多相似之处,但二叉树不是树的特殊情形。 2.两个重要的概念: (1)完全二叉树——只有最下面的两层结点度小于2,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树; (2)满二叉树——除了叶结点外每一个结点都有左右子女且叶结点都处在最底层的二叉树,。 如下图: 完全二叉树 1页

树与二叉树习题解析(答)

习题五树与二叉树 一、选择题 1、一棵非空的二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足。 A、所有的结点均无左孩子 B、所有的结点均无右孩子 C、只有一个叶子结点 D、是任意一棵二叉树 2、一棵完全二叉树上有1001个结点,其中叶子结点的个数是。 A、250 B、500 C、254 D、505 E、以上答案都不对 3、以下说法正确的是。 A、若一个树叶是某二叉树前序遍历序列中的最后一个结点,则它必是该子树后序遍历序列中的最后一个结点 B、若一个树叶是某二叉树前序遍历序列中的最后一个结点,则它必是该子树中序遍历序列中的最后一个结点 C、在二叉树中,具有两个子女的父结点,在中序遍历序列中,它的后继结点最多只能有一个子女结点 D、在二叉树中,具有一个子女的父结点,在中序遍历序列中,它没有后继子女结点 4、以下说法错误的是。 A、哈夫曼树是带权路径长度最短得数,路径上权值较大的结点离根较近 B、若一个二叉树的树叶是某子树中序遍历序列中的第一个结点,则它必是该子树后序 遍历序列中的第一个结点 C、已知二叉树的前序遍历和后序遍历并不能唯一地确定这棵树,因为不知道树的根结 点是哪一个 D、在前序遍历二叉树的序列中,任何结点其子树的所有结点都是直接跟在该结点之后 的 5、一棵有124个叶结点的完全二叉树,最多有个结点。

A、247 B、248 C、249 D、250 E、251 6、任何一棵二叉树的叶结点在前(先)序、中序和后序遍历序列中的相对次序。 A、不发生变化 B、发生变化 C、不能确定 7、设a、b为一棵二叉树上的两个结点。在中序遍历时,a在b前面的条件是。 A、a在b的右方 B、a在b的左方 C、a是b的祖先 D、a是b的子孙 8、设深度为k的二叉树上只有度为0和度为2的结点,则这类二叉树上所含的结点总数为。 A、不确定 B、2k C、2k-1 D、2k+1 9、设有13个值,用它们组成一棵哈夫曼树,则该哈夫曼树共有个结点。 A、13 B、12 C、26 D、25 10、下面几个符号串编码集合中,不是前缀编码的是。 A、{0,10,110,1111} B、{11,10,001,101,0001} C、{00,010,0110,1000} D、{b,c,aa,ac,aba,abb,abc} 11、欲实现任意二叉树的后序遍历的非递归算法而不使用栈结构,最佳的方案是二叉树采用存储结构。 A、三叉链表 B、广义表 C、二叉链表 D、顺序表 12、以下说法错误的是。 A、存在这样的二叉树,对它采用任何次序遍历其结点访问序列均相同 B、二叉树是树的特殊情形 C、由树转换成二叉树,其根结点的右子树总是空的 D、在二叉树只有一棵子树的情况下也要明确指出该子树是左子树还是右子树 13、树的基本遍历策略可分为先根遍历和后根遍历,二叉树的基本遍历策略可分为先序、中序和后序三种遍历。我们把由树转化得到的二叉树称该树对应的二叉树,则下面是正确的。 A、树的先根遍历序列与其对应的二叉树先序遍历序列相同

数据结构实验报告之树与二叉树

学生实验报告 学院:软通学院 课程名称:数据结构与算法 专业班级:软件142 班 姓名:邹洁蒙 学号: 0143990

学生实验报告 (二) 一、实验综述 1、实验目的及要求 目的:1)掌握树与二叉树的基本概念; 2)掌握二叉树的顺序存储,二叉链表的先序遍历中序遍历和后序遍历算法; 3)掌握树的双亲表示法。 要求:1)编程:二叉树的顺序存储实现; 2)编程:二叉链表的先序遍历中序遍历和后序遍历实现; 3)编程:树的双亲表示法实现。 2、实验仪器、设备或软件 设备:PC 软件:VC6 二、实验过程(编程,调试,运行;请写上源码,要求要有注释) 1.编程:二叉树的顺序存储实现 代码: BiTree::BiTree()//建立存储空间 { data = new int[MAXSIZE]; count = 0; } void BiTree::AddNode(int e)//加结点 { int temp = 0; data[count] = e; count++;//从编号0开始保存 }

运行截图: 2.编程:二叉链表的先序遍历中序遍历和后序遍历实现代码: void InOrderTraverse(BiTree* Head)//中序遍历 { if (Head) { InOrderTraverse(Head->LeftChild); cout << Head->data<<" "; InOrderTraverse(Head->RightChild); } } void PreOrderTraverse(BiTree* Head)//先序遍历 { if (Head) { cout << Head->data << " "; PreOrderTraverse(Head->LeftChild); PreOrderTraverse(Head->RightChild); } } void PostOrderTraverse(BiTree* Head)//后序遍历 { if (Head) { PostOrderTraverse(Head->LeftChild); PostOrderTraverse(Head->RightChild); cout << Head->data << " "; } } 运行截图:

二叉树习题及答案

1.设一棵完全二叉树共有699个结点,则在该二叉树中的叶子结点数? 1根据“二叉树的第i层至多有2^(i ? 1)个结点;深度为k的二叉树至多有2^k ? 1个结点(根结点的深度为1)”这个性质: 因为2^9-1 < 699 < 2^10-1 ,所以这个完全二叉树的深度就是10,前9层就是一个满二叉树, 这样的话,前九层的结点就有2^9-1=511个;而第九层的结点数就是2^(9-1)=256 所以第十层的叶子结点数就是699-511=188个; 现在来算第九层的叶子结点个数。 由于第十层的叶子结点就是从第九层延伸的,所以应该去掉第九层中还有子树的结点。因为第十层有188个,所以应该去掉第九层中的188/2=94个; 所以,第九层的叶子结点个数就是256-94=162,加上第十层有188个,最后结果就是350个 2完全二叉树:若二叉树中最多只有最下面两层的结点的度可以小于2,并且最下面一层的结点(叶结点)都依次排列在该层最左边的位置上,这样的二叉树为完全二叉树。 比如图: 完全二叉树除叶结点层外的所有结点数(叶结点层以上所有结点数)为奇数,此题中,699就是奇数,叶结点层以上的所有结点数为保证就是奇数,则叶结点数必就是偶数,这样我们可以立即选出答案为B! 如果完全二叉树的叶结点都排满了,则就是满二叉树,易得满二叉树的叶结点数就是其以上所有层结点数+1比如图: 此题的其实就是一棵满二叉树,我们根据以上性质,699+1=700,700/2=350,即叶结点数为350,叶结点层以上所有结点数为350-1=349。 3完全二叉树中,只存在度为2的结点与度为0的结点,而二叉树的性质中有一条就是:n0=n2+1;n0指度为0的结点,即叶子结点,n2指度为2的结点,所以2n2+1=699 n2=349;n0=350 2.在一棵二叉树上第5层的结点数最多就是多少 一棵二叉树,如果每个结点都就是就是满的,那么会满足2^(k-1)1。 所以第5层至多有2^(5-1)=16个结点! 3、在深度为5的满二叉树中,叶子结点的个数为 答案就是16 ~ 叶子结点就就是没有后件的结点~ 说白了~ 就就是二叉树的最后一层~ 深度为K的二叉树~ 最多有2^k-1个结点~ 最多有2^(k-1)个结点~ 所以此题~ 最多有2^5-1=31个结点~ 最多有2^(5-1)=16个叶子结点~ 4、某二叉树中度为2的结点有18个,则该二叉树中有几个叶子结点? 结点的度就是指树中每个结点具有的子树个数或者说就是后继结点数。 题中的度为2就是说具有的2个子树的结点; 二叉树有个性质:二叉树上叶子结点数等于度为2的结点数加1。 5、在深度为7的满二叉树中,度为2的结点个数为多少, 就就是第一层只有一个节点,她有两个子节点,第二层有两个节点,她们也都有两个子节点以此类推,所以到第6层,就有2的5次方个节点,她们都有两个子节点 最后第7层都没有子节点了。因为就是深度为7的。 所以就就是1+2+4+8+16+32了

习题6树和二叉树.docx

习题6树和二叉树 说明: 本文档中,凡红色字标出的题请提交纸质作业,只写题号和答案即可。 6.1单项选择题 1. 由于二叉树屮每个结点的度最大为2,所以二叉树是一种特殊的树,这种说法_B_。 A. 正确 B.错误 2. 假定在一棵二叉树屮,双分支结点数为15,单分支结点数为30个,则叶子结点数为 B_个。 A. 15 B. 16 C. 17 D. 47 3. 按照二叉树的定义,具有3个结点的不同形状的二叉树有_C_种。 A. 3 B.4 C. 5 D. 6 4. 按照二叉树的定义,具有3个不同数据结点的不同的二叉树有_C_种。 A.5 B.6 C. 30 D. 32 5. 深度为5的二叉树至多有_C_个结点。 A. 16 B. 32 C. 31 D. 10 6. 设高度为h 的二叉树上只有度为0和度为2的结点,则此类二叉树中所包含的结点 数至少为 B 。 A. 2h B. 2h-l C. 2h+l D. h+l 7. 对一个满二叉树,m 个树叶,n 个结点,深度为h,则_A_。 A. n=h+m B. h+m=2n C. m=h-1 D. n=2 h -l 8. 任何一棵二叉树的叶结点在先序、中序和后序遍历序列中的相对次序_A_。 A.不发生改变 B.发生改变 C.不能确定 D.以上都不对 9. 如杲某二叉树的前根次序遍历结果为stuwv,中序遍历为uwtvs,那么该二叉树的后 序为_C_。 A. uwvts B. vwuts C. wuvts D. wutsv 10. 二叉树的前序遍历序列中,任意一个结点均处在其子女结点的前面,这种说法_A_。 A.正确 B.错误 11. 某二叉树的前序遍历结点访问顺序是abdgcefh,中序遍历的结点访问顺序是 dgbaechf,则其后序遍历的结点访问顺序是_D_。 A. bdgcefha B. gdbecfha 12. 在一非空二叉树的中序遍历序列中, A.只有右子树上的所有结点 13. 如图6.1所示二叉树的中序遍历序列是_B_。 14. 一棵二叉树如图6.2所示,其中序遍历的序列为 B 。 A. abdgcefh B. dgbaechf C. gdbehfca D. abcdefgh C. bdgaechf D. gdbehfca 根结点的右边_A_。 B.只有右子树上的部分结点 C.只有左子树上的部分结点 D.只有左子树上的所有结点 A. abcdgef B. dfebagc C. dbaefcg D. defbagc 图6」

数据结构第六章树和二叉树练习及答案

一、选择题 1、设T是一棵树,T’是对应于x的二叉树,则T的先根次序遍历和T’的()次序遍历相同。 A、先根 B、中根 C、后根 D、以上都不是 2、 3、若二叉树的后序遍历序列为dabec,中序遍历序列为debac,则前序序列遍历为()。 A、acbed B、decab C、deabc D、cedba 4、具有35个结点的完全二叉树的深度为() A、5 B、6 C、7 D、8 5、将一棵有100个结点的完全二叉树从上到下,从左到右依次对结点进行编号,根结点的编号为1,则编号为49的结点的左孩子结点编号为() A、98 B、99 C、50 D、48 6、某二叉树的前序和后序序列正好相反,则该二叉树一定是()的二叉树。 A、空或只有一个结点 B、高度等于其结点数 C、任一结点无左孩子 D、任一结点无左孩子 7、二叉树在线索化后,仍不能有效求解的问题是() A、先根线索二叉树中求先根后继 B、中根线索二叉树中求中根后继 C、中根线索二叉树中求中根前驱 D、后根线索二叉树中求后根后继 8、在线索化二叉树中,t所指结点没有左子树的充足条件是() A、t-lchild==NULL B、t->ltag==1 C、t->ltag==1&&t->lchild==NULL D、以上都不对 9、设高度为h的二叉树上只有度为0和度为2的结点,则此类二叉树中所包含的结点数至少为() A、2h B、2h-1 C、2h+1 D、h+1 10、深度为5的二叉树至多有()个结点。 A、16 B、32 C、31 D、10 11、在一非空二叉树的中序遍历序列中,根结点的右边() A、只有右子树上的所有结点 B、只有右子树上的部分结点 C、只有左子树上的所有结点 D、只有左子树上的部分结点 12、树最适合用来表示() A、有序数据元素 B、无序数据元素 C、元素之间具有分支层次关系的数据 D、元素之间无联系的数据 13、任何一棵二叉树的叶结点在先序、中序和后序遍历序列中的相对次序() A、不发生改变 B、发生改变 C、不能确定 D、以上都不对 14、设n,m为一棵二叉树上的两个结点,在中序遍历时,n在m前的条件是() A、n在m右方 B、n是m祖先 C、n在m左方 D、n是m子孙 15、线索二叉树是一种()结构 A、逻辑 B、逻辑和存储 C、物理 D、线性 16、森林的后根遍历序列与其对应二叉树的()遍历序列一致。 A、先根 B、后根 C、中根 D、不可能 二、填空题 1、由一棵二叉树后序序列和(中序)可唯一确定这棵二叉树。 2、含有n个结点的二叉树用二叉链表表示时,有(N+1)个空链域。 3、有m个叶子结点的哈夫曼树有(2*M-1)个结点。

数据结构实验报告—二叉树

算法与数据结构》课程实验报告

一、实验目的 1、实现二叉树的存储结构 2、熟悉二叉树基本术语的含义 3、掌握二叉树相关操作的具体实现方法 二、实验内容及要求 1. 建立二叉树 2. 计算结点所在的层次 3. 统计结点数量和叶结点数量 4. 计算二叉树的高度 5. 计算结点的度 6. 找结点的双亲和子女 7. 二叉树前序、中序、后序遍历的递归实现和非递归实现及层次遍历 8. 二叉树的复制 9. 二叉树的输出等 三、系统分析 (1)数据方面:该二叉树数据元素采用字符char 型,并且约定“ #”作为二叉树输入结束标识符。并在此基础上进行二叉树相关操作。 (2)功能方面:能够实现二叉树的一些基本操作,主要包括: 1. 采用广义表建立二叉树。 2. 计算二叉树高度、统计结点数量、叶节点数量、计算每个结点的度、结点所在层次。 3. 判断结点是否存在二叉树中。 4. 寻找结点父结点、子女结点。 5. 递归、非递归两种方式输出二叉树前序、中序、后序遍历。 6. 进行二叉树的复制。 四、系统设计 (1)设计的主要思路 二叉树是的结点是一个有限集合,该集合或者为空,或者是由一个根节点加上两棵分别称为左子树和右子树、互不相交的二叉树组成。根据实验要求,以及课上老师对于二叉树存储结构、基本应用的讲解,同时课后研究书中涉及二叉树代码完成二叉树模板类,并将所需实现各个功能代码编写完成,在建立菜单对功能进行调试。 (2)数据结构的设计 二叉树的存储结构有数组方式和链表方式。但用数组来存储二叉树有可能会消耗大量的存储空间,故在此选用链表存储,提高存储空间的利用率。根据二叉树的定义,二叉

二叉树习题及答案(考试学习)

1.设一棵完全二叉树共有699个结点,则在该二叉树中的叶子结点数? 1根据“二叉树的第i层至多有2^(i ? 1)个结点;深度为k的二叉树至多有2^k ? 1个结点(根结点的深度为1)”这个性质: 因为2^9-1 < 699 < 2^10-1 ,所以这个完全二叉树的深度是10,前9层是一个满二叉树, 这样的话,前九层的结点就有2^9-1=511个;而第九层的结点数是2^(9-1)=256 所以第十层的叶子结点数是699-511=188个; 现在来算第九层的叶子结点个数。 由于第十层的叶子结点是从第九层延伸的,所以应该去掉第九层中还有子树的结点。因为第十层有188个,所以应该去掉第九层中的188/2=94个; 所以,第九层的叶子结点个数是256-94=162,加上第十层有188个,最后结果是350个 2完全二叉树:若二叉树中最多只有最下面两层的结点的度可以小于2,并且最下面一层的结点(叶结点)都依次排列在该层最左边的位置上,这样的二叉树为完全二叉树。 比如图: 完全二叉树除叶结点层外的所有结点数(叶结点层以上所有结点数)为奇数,此题中,699是奇数,叶结点层以上的所有结点数为保证是奇数,则叶结点数必是偶数,这样我们可以立即选出答案为B! 如果完全二叉树的叶结点都排满了,则是满二叉树,易得满二叉树的叶结点数是其以上所有层结点数+1比如图: 此题的其实是一棵满二叉树,我们根据以上性质,699+1=700,700/2=350,即叶结点数为350,叶结点层以上所有结点数为350-1=349。 3完全二叉树中,只存在度为2的结点和度为0的结点,而二叉树的性质中有一条是:n0=n2+1;n0指度为0的结点,即叶子结点,n2指度为2的结点,所以2n2+1=699 n2=349;n0=350 2.在一棵二叉树上第5层的结点数最多是多少 一棵二叉树,如果每个结点都是是满的,那么会满足2^(k-1)1。 所以第5层至多有2^(5-1)=16个结点! 3.在深度为5的满二叉树中,叶子结点的个数为 答案是16 ~ 叶子结点就是没有后件的结点~ 说白了~ 就是二叉树的最后一层~ 深度为K的二叉树~ 最多有2^k-1个结点~ 最多有2^(k-1)个结点~ 所以此题~ 最多有2^5-1=31个结点~ 最多有2^(5-1)=16个叶子结点~ 4.某二叉树中度为2的结点有18个,则该二叉树中有几个叶子结点? 结点的度是指树中每个结点具有的子树个数或者说是后继结点数。 题中的度为2是说具有的2个子树的结点; 二叉树有个性质:二叉树上叶子结点数等于度为2的结点数加1。 5.在深度为7的满二叉树中,度为2的结点个数为多少, 就是第一层只有一个节点,他有两个子节点,第二层有两个节点,他们也都有两个子节点以此类推,所以到第6层,就有2的5次方个节点,他们都有两个子节点

树和二叉树练习题答案

第5章树和二叉树练习题答案 一、下面是有关二叉树的叙述,请判断正误 (√)1. 若二叉树用二叉链表作存贮结构,则在n个结点的二叉树链表中只有n—1个非空指针域。(×)2.二叉树中每个结点的两棵子树的高度差等于1。 (√)3.二叉树中每个结点的两棵子树是有序的。 (×)4.二叉树中每个结点有两棵非空子树或有两棵空子树。 (×)5.二叉树中每个结点的关键字值大于其左非空子树(若存在的话)所有结点的关键字值,且小于其右非空子树(若存在的话)所有结点的关键字值。(应当是二叉排序树的特点) (×)6.满二叉树中所有结点个数是2k-1-1,其中k是树的深度。(应2k-1) (×)7.二叉树中所有结点,如果不存在非空左子树,则不存在非空右子树。 (×)8.对于一棵非空二叉树,它的根结点作为第一层,则它的第i层上最多能有2i—1个结点。(应2i-1)(√)9.用二叉链表法(link-rlink)存储包含n个结点的二叉树,结点的2n个指针区域中有n+1个为空指针。 (正确。用二叉链表存储包含n个结点的二叉树,结点共有2n个链域。由于二叉树中,除根结点外,每一个结点有且仅有一个双亲,所以只有n-1个结点的链域存放指向非空子女结点的指针,还有n+1个空指针。)即有后继链接的指针仅n-1个。 (√)10.具有12个结点的完全二叉树有5个度为2的结点。 二、填空 1.由3个结点所构成的二叉树有5种形态。 2. 一棵深度为6的满二叉树有n1+n2=0+ n2= n0-1=31 个分支结点和26-1 =32个叶子。 注:满二叉树没有度为1的结点,所以分支结点数就是二度结点数。 3.一棵具有257个结点的完全二叉树,它的深度为9。 (注:用? log2(n) ?+1= ? 8.xx ?+1=9 4.设一棵完全二叉树有700个结点,则共有350个叶子结点。 5. 设一棵完全二叉树具有1000个结点,则此完全二叉树有500个叶子结点,有499个度为2的结点,有1个结点只有非空左子树,有0个结点只有非空右子树。 答:最快方法:用叶子数=[n/2]=500 ,n2=n0-1=499。另外,最后一结点为2i属于左叶子,右叶子是空的,所以有1个非空左子树。完全二叉树的特点决定不可能有左空右不空的情况,所以非空右子树数=0. 6.一棵含有n个结点的k叉树,可能达到的最大深度为n,最小深度为2。 答:当k=1(单叉树)时应该最深,深度=n(层);当k=n-1(n-1叉树)时应该最浅,深度=2(层),但不包括n=0或1时的特例情况。 7. 二叉树的基本组成部分是:根(N)、左子树(L)和右子树(R)。因而二叉树的遍历次序有六种。最常用的是三种:前序法(即按N L R次序),后序法(即按L R N次序)和中序法(也称对称序法,即按L N R次序)。这三种方法相互之间有关联。若已知一棵二叉树的前序序列是BEFCGDH,中序序列是FEBGCHD,则它的后序序列必是 F E G H D C B。 解:法1:先由已知条件画图,再后序遍历得到结果; 法2:不画图也能快速得出后序序列,只要找到根的位置特征。由前 序先确定root,由中序先确定左子树。例如,前序遍历BEFCGDH中, 根结点在最前面,是B;则后序遍历中B一定在最后面。 法3:递归计算。如B在前序序列中第一,中序中在中间(可知左 右子树上有哪些元素),则在后序中必为最后。如法对B的左右子树同 样处理,则问题得解。

相关文档
相关文档 最新文档