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