数据结构第六章

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、假设在树中,结点x是结点y的双亲时,用(x,y)来表示树边.已知一棵树边的集合为{(i,m),(i,n),(e,i),(b,e),(b,d),(a,b),(g,j),(g,k),(c,g),(c,f),(h,l),(c,h),(a,c)}用树形表示法出此树,并回答下列问题:

(1)哪个是根结点? (2)哪些是叶结点? (3)哪个是g的双亲? (4)哪些是g的祖先? (5)哪些是g的孩子? (6)哪些是e的子孙? (7)哪些是e的兄弟?哪些是f的兄弟? (8)结点b和n的层次各是多少? (9)树的深度是多少? (10)以结点c为根的子树的深度是多少? (11) 树的度数是多少?

答:a是根结点;

dmnfjkl是叶结点;

c是g的双亲;

c,a是g的祖先;

j,k是g的孩子;

imn是e的子孙;

d是e的兄弟;g,h是f的兄弟;

b的层次是2;n的层次是5;

树的深度是5;

以c为根的子树深度是3;

树的度数是3;

二、一棵度为2的有序树与一棵二叉树有何区别?

答:

一棵度为二的有序树与一棵二叉树的区别在于:有序树的结点次序是相对于另一结点而言的,如果有序树中的子树只有一个孩子时,这个孩子结点就无须区分其左右次序,而二叉树无论其孩子数是否为2,均需确定其左右次序,也就是说二叉树的结点次序不是相对于另一结点而言而是确定的。

三、三个结点的树如下:只有两种形态

○○

/ \ |

○ ○○

|

三个结点的二叉树如下所示:有五种形态:

(1) (2) (3) (4) (5)

○○○○○

/ \ / / \ \

○○○○○○

/ \ / \

○○○○

四、一个深度为h的满k叉树有如下性质:第h层上的结点都是叶子结点,其余各层上每个结点都有k棵非空子树。如果按层次顺序(同层自左至右)从1开始对全部结点编号,问:

(1)各层的结点数目是多少?

(2)编号为i的结点的双亲结点(若存在)的编号是多少?

(3)编号为i的结点的第j个孩子结点(若存在)的编号是多少?

(4)编号为i的结点的有右兄弟的条件是什么? 其右兄弟的编号是多少?

解:

(1) 层号为h的结点数目为k h-1

(2) 编号为i的结点的双亲结点的编号是:|_ (i-2)/k _|+1(不大于(i-2)/k的最大整数。也就是(i-2)与k整除的结果.以下/表示整除。

(3) 编号为i的结点的第j个孩子结点编号是:k*(i-1)+1+j;

(4) 编号为i的结点有右兄弟的条件是(i-1)能被k整除

右兄弟的编号是i+1.

五、已知一棵度为m的树中有n1个度为1的结点,n2个度为2的结点,……,n m个度为m 的结点,问该树中共有多少个叶子结点?有多少个非终端结点?

解:设树中共有n个结点,n0个叶结点,那么

n=n0+n1+…+n m (1)树中除根结点外,每个结点对应着一个分支,而度为k的结点发出k个分支,所以

n=n1+2×n2+…+m×n m+1 (2)由(1)(2)可知n0= n2+2×n3+3×n4+…+(m-1) ×n m+1

八、证明:一棵满K叉树上的叶子结点数n0和非叶子结点数n1之间满足以下关系:n0=(k-1)n1+1。

证明:n=n0+n1

n=n1k+1

由上述式子可以推出n0=(k-1)n1+1

十五、请对右图所示的二叉树进行后序线索化,为每个空指针建立相应的前驱或后继线索。

二十七、假设一棵二叉树的先序序列为:EBADCFHGIKJ和中序序列为ABCDEFGHIJK,请画出该树。

二十八、假设一棵二叉树的中序序列为:DCBGEAHFIJK和后序序列为:DCEGBFHKJIA,请画出该树。

二十九、假设一棵二叉树的层次序列为:ABCDEFGHIJ和中序序列为:DBGEHJACIF,请画出该树。

三十七、试利用栈的基本操作写出先序遍历的非递归形式的算法。

void PreOrder_Nonrecursive(Bitree T)//先序遍历二叉树的非递归算法

{

InitStack(S);

Push(S,T); //根指针进栈

while(!StackEmpty(S))

{

while(Gettop(S,p)&&p)

{

visit(p->data);

push(S,p->lchild);

} //向左走到尽头

pop(S,p);

if(!StackEmpty(S))

{

pop(S,p);

push(S,p->rchild); //向右一步

}

}//while

}//PreOrder_Nonrecursive

四十二、编写递归算法,计算二叉树中叶子结点的数目。

int LeafCount_BiTree(Bitree T)//求二叉树中叶子结点的数目

{

if(!T) return 0; //空树没有叶子

else if(!T->lchild&&!T->rchild) return 1; //叶子结点

else return Leaf_Count(T->lchild)+Leaf_Count(T->rchild);//左子树的叶子数加上右子树的叶子数

}//LeafCount_BiTree

四十三、编写一递归算法,将二叉树中的所有结点的左、右子树相互交换。

【分析】

依题意,设t 为一棵用二叉链表存储的二叉树,则交换各结点的左右子树的运算基于后序遍历实现:交换左子树上各结点的左右子树;交换右子树上各结点的左右子树;再交换根结点的左右子树。

【算法】

void Exchg(BiTree *t){

BinNode *p;

if (t){

Exchg(&((*t)->lchild));

Exchg(&((*t)->rchild));

P=(*t)->lchild;

(*t)->lchild=(*t)->rchild;

(*t)->rchild=p;

}

}

相关文档
最新文档