第六章-树和森林习题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
习题6.6上图
习题6.8:
void Get_PreOrder(BiTree T,int k,TElemType &e)
{ //求先序序列中第k个位置上结点的值
if(T)
{ c++; //每访问一个子树的根都会使前序序号计数器加1,c设为全局量if(c==k)
{ e=T->data; return;}
else
{ Get_PreOrder(T->lchild, k, e ); //在左子树中查找
Get_PreOrder(T->rchild, k ,e); //在右子树中查找
}
}//if
} //Get_PreOrder
习题6.9:
int LeafCount(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
习题6.10: //交换所有结点的左右子树
void Change_BiTree (BiTree T)
{ BiTree temp
if(T)
{ temp=T->lchild;
T->lchild=T->rchild;
T->rchild=temp
} //交换左右子树
if(T->lchild) Change_BiTree(T->lchild);
if(T->rchild) Change_BiTree (T->rchild);
//左右子树再分别交换各自的左右子树
}//Change_BiTree
习题6.11: //求二叉树中以值为x的结点为根的子树深度
int Get_Sub_Depth(BiTree T,int x, int &depth)
{ if(T->data==x)
{ depth=Get_Depth(T); return;}//找到了值为x的结点,求其深度 else
{ if(T->lchild) Get_Sub_Depth(T->lchild,x,depth);
if(T->rchild) Get_Sub_Depth(T->rchild,x,depth);
} //在左右子树中继续寻找
} //Get_Sub_Depth
int Get_Depth(BiTree T) //求子树深度的递归算法
{ if(!T) return 0;
else
{ m=Get_Depth(T->lchild);
n=Get_Depth(T->rchild);
return (m>n?m:n)+1;
}
}//get depth
习题6.12: // 删除所有以元素x为根的子树
void Del_Sub_x(BiTree T,int x)
{ if(T->data==x) Del_Sub(T); //删除该子树
else
{ if(T->lchild) Del_Sub_x(T->lchild,x);
if(T->rchild) Del_Sub_x(T->rchild,x);
} //else 在左右子树中继续查找
} //Del_Sub_x
void Del_Sub(BiTree T) //删除子树T
{ if(T->lchild) Del_Sub(T->lchild);
if(T->rchild) Del_Sub(T->rchild);
free(T);
} //Del_Sub
习题6.13: // 根据顺序存储结构建立二叉链表
Status CreateBiTree_SqList(BiTree &T, SqList sa)
{ BiTree ptr[st+1]; //该数组储存与sa中各结点对应的树指针 if(!st)
{ T=NULL; return; } //空树
ptr[1]=new BTNode;
ptr[1]->data=sa.elem[1]; //建立树根
T=ptr[1];T->lchild=NULL; T->rchild=NULL;
for(i=2; i<=st; i++)
{ ptr[i]=new BTNode;
ptr[i]->data=sa.elem[i];
j=i/2; //找到结点i的双亲j
if(i-j*2) ptr[j]->rchild=ptr[i]; //i是j的右孩子
else ptr[j]->lchild=ptr[i]; //i是j的左孩子
}
return OK;
} //CreateBitree_SqList
习题6.19: //求一棵以孩子兄弟链表表示的树的度
int GetDegree_CSTree(CSTree T)
//求孩子兄弟链表表示的树T的度
{ if(!T->firstchild) return 0; //空树
else
{ degree=0;
for( p=T->firstchild; p; p=p->nextsibling)
degree++; //本结点的度
for( p=T->firstchild; p; p=p->nextsibling)
{ d=GetDegree_CSTree(p);
if(d>degree) degree=d; //孩子结点的度的最大值}
return degree;
}//else
} //GetDegree_CSTree
习题6.20: //求孩子兄弟链表表示的树T的叶子数目
int LeafCount_CSTree(CSTree T )
{ if(!T) return 0;
else if(!T->firstchild) return 1; //叶子结点
else
{ count=0;
for(p=T->firstchild;p;p=child->nextsibling)
count+=LeafCount_CSTree(p);
return count; //各子树的叶子数之和
}
} //LeafCount_CSTree
习题6.20: //求孩子兄弟链表表示的树T的叶子数目
int LeafCount(CSTree T )
{ CSTree p=T;
int k=0;
if(p!=NULL)
{ if(p->firstchild==NULL)
k=1+LeafCount(p->firstchild)+LeafCount (p->nextsibling);
else
k=0+LeafCount(p->firstchild)+LeafCount(p->nextsibling);
}