知识大全 第6章树(算法设计)习题练习答案

Posted 结点

篇首语:生活不是等待风暴过去,而是学会在雨中翩翩起舞。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 第6章树(算法设计)习题练习答案相关的知识,希望对你有一定的参考价值。

* 二叉树的遍历算法可写为通用形式 例如通用的中序遍历为  void Inorder(BinTree T void(* visit)(DataType x))  if (T)    Inorder(T >lchild Visit);//遍历左子树    Visit(T >data);//通过函数指针调用它所指的函数来访问结点    Inorder(T >rchild Visit);//遍历右子树      其中Visit是一个函数指针 它指向形如void f(DataType x)的函数 因此我们可以将访问结点的操作写在函数f中通过调用语句Inorder(root f)将f的地址传递给Visit 来执行遍历操作 请写一个打印结点数据的函数 通过调用上述算法来完成书中 节的中序遍历   函数如下  void PrintNode(BinTree T)     printf( %c T >data);   //定义二叉树链式存储结构 typedef char DataType;//定义DataType类型 typedef struct node   DataType data;    struct node *lchild *rchild;//左右孩子子树  BinTNode; //结点类型 typedef BinTNode *BinTree ;//二叉树类型 void Inorder(BinTree T void(* Visit)(DataType x))     if(T)         Inorder(T >lchild Visit);//遍历左子树     Visit(T >data); //通过函数指针调用它所指的函数访问结点     Inorder(T >rchild Visit);//遍历右子树       

以二叉链表为存储结构 分别写出求二叉树结点总数及叶子总数的算法  ( )求结点数的递归定义为   若为空树 结点数为   若只有根结点 则结点数为   否则 结点数为根结点的左子树结点数+右子树结点数+  ( )求叶子数的递归定义为   若为空树 叶子数为   若只有根结点 则叶子数为   否则 叶子数为根结点的左子树叶子数+右子树叶子数 typedef char DataType;//定义DataType类型 typedef struct node    DataType data;    struct node *lchild *rchild;//左右孩子子树  BinTNode; //结点类型 typedef BinTNode *BinTree ;//二叉树类型 int Node(BinTree T)  //算结点数   if(T)    if (T >lchild==NULL)&&(T >rchild==NULL)     return ;    else return Node(T >lchild)+Node(T >rchild)+ ;   else return ;   int Leaf(BinTree T)   //算叶子数   if(T)    if (T >lchild==NULL)&&(T >rchild==NULL)     return ;    else return Leaf(T >lchild)+Node(T >rchild);   else return ;   

以二叉链表为存储结构 分别写出求二叉树高度及宽度的算法 所谓宽度是指二叉树的各层上 具有结点数最多的那一层上的结点总数  ( )根据递归定义 二叉树的高度为    当为空树时 高度为    当只有一个结点时 高度为    其他情况 高度为max(根的左子树高度 根的右子树高度)+  int Height(BinTree T)     int hl hr;    if(T)    //非空树      if(t >lchild==NUll)&&(t >rchild==NULL)//只含一个根结点      return ;     else              hl=height(t >lchild);//根的左子树高度       hr=height(t >rchild);//根的右子树高度       if (hl>=hr)        return hl+ ;       else return h + ;             else return ;   ( )要求二叉树的宽度的话 则可根据树的高度设置一个数组temp temp[i]用于存放第i层上的结点数(即宽度) 在访问结点时 把相应计算该结点下一层的孩子数并存入相应数组元素中 遍历左子树后向上返回一层计算右子树的宽度 并取出最大的一个数组元素作为树的宽度  #define M //假设二叉树最多的层数 int Width(BinTree T)      int static n[M];//向量存放各层结点数   int static i= ;   int static max= ;//最大宽度   if(T)         if(i== ) //若是访问根结点              n[i]++; //第 层加        i++; //到第 层       if(T >lchild)//若有左孩子则该层加         n[i]++;       if(T >rchild)//若有右孩子则该层加         n[i]++;           else       //访问子树结点       i++; //下一层结点数       if(T >lchild)        n[i]++;       if(T >rchild)         n[i]++;           if(max<n[i])max=n[i];//取出最大值      Width(T >lchild);//遍历左子树     i ; //往上退一层     Width(T >rchild);//遍历右子树       return max;  //算法结束

以二叉链表为存储结构 写一算法交换各结点的左右子树 答   要交换各结点的左右子树 最方便的办法是用后序遍历算法 每访问一个结点时把两棵子树的指针进行交换 最后一次访问是交换根结点的子树  void ChangeBinTree(BinTree *T)   //交换子树   if(*T)      //这里以指针为参数使得交换在实参的结点上进行后序遍历     BinTree temp;     ChangeBinTree(&(*T) >lchild);     ChangeBinTree(&(*T) >rchild);     temp=(*T) >lchild;     (*T) >lchild=(*T) >rchild;     (*T) >rchild=temp;       

以二叉链表为存储结构 写一个拷贝二叉树的算法void CopyTree(BinTree root BinTree *newroot) 其中新树的结点是动态申请的 为什么newroot要说明为BinTree型指针的指针? 解   因为调用函数只能进行值传递 当返回类型为void时 就必须把实参的地址传给函数 否则函数不会对实际参数进行任何操作 也就得不到所需结果了 所以 newroot要说明为BinTree型指针 void CopyTree(BinTree root BinTree *newroot)   //拷贝二叉树   if(root)//如果结点非空     //按前序序列拷贝     *newroot=(BinTNode *)malloc(sizeof(BinTNode));//生成新结点     (*newroot) >data=root >data;//拷贝结点数据     CopyTree(root >lchild &(*newroot) >lchild);//拷贝左子树     CopyTree(root >rchild &(*newroot) >rchild);//拷贝右子树       else //如果结点为空   *newroot=NULL;//将结点置空  

以二叉链表为存储结构 分别写出在二叉树中查找值为x的结点及求x所在结点在树中层数的算法 解   根据上几题的算法可以得出本题的算法如下  #define M //假设二叉树最多的层数 BinTree SearchBTree(BinTree *T DataType x)  //以前序遍历算法查找值为x的结点   if(*T)         if((*T) >data==x )return *T;     SearchBTree(&(*T) >lchild x);     SearchBTree(&(*T) >rchild x);       int InLevel(BinTree T DataType x)     int static l= ;//设一静态变量保存层数   if(T)          if(l== )//若是访问根结点              l++;//第 层       if(T >data==x)return l;       if(T >lchild||T >rchild)         l++;//若根有子树 则层数加            else       //访问子树结点       if(T >data==x)return l;       if(T >lchild||T >rchild)         l++;//若该结点有子树 则层数加        else return ;           InLevel(T >lchild x);//遍历左子树     InLevel(T >rchild x);//遍历右子树      

相关参考