当前位置:文档之家› 第六章-树和森林习题

第六章-树和森林习题

习题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 tempif(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_Depthint 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_xvoid 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的双亲jif(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);elsek=0+LeafCount(p->firstchild)+LeafCount(p->nextsibling);}else k=0;return k;} //LeafCount习题6.23: //按树状打印输出二叉树的元素,i表示结点所在层次,初次调用时i=0 void Print_BiTree(BiTree T,int i){ if(T->rchild) Print_BiTree(T->rchild , i+1);for(j=1;j<=i; j++ )printf (“ ”); //打印i个空格以表示出层次cout<<T->data<<endl; //打印T元素,换行if(T->lchild) Print_BiTree(T->rchild, i+1 );} //Print_BiTree分析:该递归算法实际上是带层次信息的中序遍历,只不过按照题目要求,顺序为先右后左.补充习题:1.树最适合用来表示()。

A)有序数据元素B)无序数据元素C)元素之间具有分支层次关系的数据D)元素之间无联系的数据2.设深度为h的二叉树上只有度为0和度为2的结点,则此类二叉树中所包含的结点数至多为( )。

A)2h-1 B)2(h-1) C)2*h-1 D)2*h3.在一棵二叉树中,第5层上的结点数最多有( )。

A)10 B)15 C)16 D)324.下图所示的二叉树中,( )不是完全二叉树。

5.有100个结点的完全二叉树,叶子结点的个数为:( )。

A)49 B)50 C)51 D)526.已知某二叉树的叶子结点数为20 ,10个结点有一个左孩子,15个结点有一个右孩子,求该二叉树的总结点数?解:该二叉树叶子结点数:n0=20,度为1的结点数:n1=10+15,根据二叉树的性质3,n0=n2+1,n2=n0-1=19, 则:n=n0+n1+n2=64.7.具有100个结点的二叉树中,若用二叉链表存储,其指针域部分用来指向结点的左、右孩子,其中()个指针域为空。

A)50 B)99 C)100 D)1018.首先访问结点的左子树,然后访问该结点,最后访问结点的右子树,这种遍历称为()。

A)前序遍历B)后序遍历C)中序遍历D)层次遍历9.任何一棵二叉树的叶结点在先序、中序和后序遍历的序列中的相对次序()。

A)不发生变化B)发生变化C)不能确定D)以上都不对10.某非空二叉树的前序序列和后序序列正好相反,则二叉树一定是()的二叉树。

A)空或只有一个结点B)高度等于其结点数C)任一结点无左孩子D)任一结点无右孩子11.如果某二叉树的先序遍历序列是abdcef,中序遍历序列是dbaefc,则其后序遍历序列是()。

A)dbafec B)fecdba C)efcdba D)dbfeca12.按照二叉树的定义,具有3个结点的二叉树形态有( )种。

A)3 B)4 C)5 D)613.二叉树的后序遍历序列中,任意一个结点均处在其孩子结点的前面()。

A)正确B)错误14.n个结点深度为h的二叉树的线索化所需的时间复杂度是( )。

A)O(1) B)O(hn) C)O(n) D)O(nlog2h)15.设a,b为一棵二叉树上的两个结点,在中序遍历时,a在b前的条件是( )。

A)a是b祖先B)a是b子孙C)a在b左方D)a在b右方16.关于二叉树的三种遍历,下列说法正确的是( )。

A)任意两种遍历序列都不可以唯一决定该二叉树B)任意两种遍历序列都可以唯一决定该二叉树C)先序遍历序列和后序遍历序列可以唯一决定该二叉树D)先序遍历序列和中序遍历序列可以唯一决定该二叉树17.在某棵二叉树的一种序列中,如果发现其中每一结点的左孩子均是其前趋,则可判断定这种序列为中序序列( )。

A)正确B)不正确18.已知某二叉树的后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是()。

A)acbed B)decab C)deabc D)cedba19.前序遍历和中序遍历结果相同的二叉树为()。

相关主题