第六章-树和森林习题

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

}

相关文档
最新文档