知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第六章答案

Posted 结点

篇首语:人生就像一场舞会,教会你最初舞步的人,未必能陪你走到散场。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第六章答案相关的知识,希望对你有一定的参考价值。

  第六章 树和二叉树

  

  int Is_Descendant_C(int u int v)//在孩子存储结构上判断u是否v的子孙 是则返回 否则返回

  

  if(u==v) return ;

  else

  

  if(L[v])

  if (Is_Descendant(u L[v])) return ;

  if(R[v])

  if (Is_Descendant(u R[v])) return ; //这是个递归算法

  

  return ;

  //Is_Descendant_C

  

  int Is_Descendant_P(int u int v)//在双亲存储结构上判断u是否v的子孙 是则返回 否则返回

  

  for(p=u;p!=v&&p;p=T[p]);

  if(p==v) return ;

  else return ;

  //Is_Descendant_P

  

  这一题根本不需要写什么算法 见书后注释:两个整数的值是相等的

  

  int Bitree_Sim(Bitree B Bitree B )//判断两棵树是否相似的递归算法

  

  if(!B &&!B ) return ;

  else if(B &&B &&Bitree_Sim(B >lchild B >lchild)&&Bitree_Sim(B >rchild B >rchild))

  return ;

  else return ;

  //Bitree_Sim

  

  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

  

  typedef struct

  BTNode* ptr;

  enum mark;

   PMType; //有mark域的结点指针类型

  void PostOrder_Stack(BiTree T)//后续遍历二叉树的非递归算法 用栈

  

  PMType a;

  InitStack(S); //S的元素为PMType类型

  Push (S T ); //根结点入栈

  while(!StackEmpty(S))

  

  Pop(S a);

  switch(a mark)

  

  case :

  Push(S a ptr ); //修改mark域

  if(a ptr >lchild) Push(S a ptr >lchild ); //访问左子树

  break;

  case :

  Push(S a ptr ); //修改mark域

  if(a ptr >rchild) Push(S a ptr >rchild ); //访问右子树

  break;

  case :

  visit(a ptr); //访问结点 返回

  

  //while

  //PostOrder_Stack

  分析:为了区分两次过栈的不同处理方式 在堆栈中增加一个mark域 mark= 表示刚刚访问此结点 mark= 表示左子树处理结束返回 mark= 表示右子树处理结束返回 每次根据栈顶元素的mark域值决定做何种动作

  

  typedef struct

  int data;

  EBTNode *lchild;

  EBTNode *rchild;

  EBTNode *parent;

  enum mark;

   EBTNode EBitree; //有mark域和双亲指针域的二叉树结点类型

  void PostOrder_Nonrecursive(EBitree T)//后序遍历二叉树的非递归算法 不用栈

  

  p=T;

  while(p)

  switch(p >mark)

  

  case :

  p >mark= ;

  if(p >lchild) p=p >lchild; //访问左子树

  break;

  case :

  p >mark= ;

  if(p >rchild) p=p >rchild; //访问右子树

  break;

  case :

  visit(p);

  p >mark= ; //恢复mark值

  p=p >parent; //返回双亲结点

  

  //PostOrder_Nonrecursive

  分析:本题思路与上一题完全相同 只不过结点的mark值是储存在结点中的 而不是暂存在堆栈中 所以访问完毕后要将mark域恢复为 以备下一次遍历

  

  typedef struct

  int data;

  PBTNode *lchild;

  PBTNode *rchild;

  PBTNode *parent;

   PBTNode PBitree; //有双亲指针域的二叉树结点类型

  void Inorder_Nonrecursive(PBitree T)//不设栈非递归遍历有双亲指针的二叉树

  

  p=T;

  while(p >lchild) p=p >lchild; //向左走到尽头

  while(p)

  

  visit(p);

  if(p >rchild) //寻找中序后继:当有右子树时

  

  p=p >rchild;

  while(p >lchild) p=p >lchild; //后继就是在右子树中向左走到尽头

  

  else if(p >parent >lchild==p) p=p >parent; //当自己是双亲的左孩子时后继就是双亲

  else

  

  p=p >parent;

  while(p >parent&&p >parent >rchild==p) p=p >parent;

  p=p >parent;

   //当自己是双亲的右孩子时后继就是向上返回直到遇到自己是在其左子树中的祖先

  //while

  //Inorder_Nonrecursive

  

  int c k; //这里把k和计数器c作为全局变量处理

  void Get_PreSeq(Bitree T)//求先序序列为k的结点的值

  

  if(T)

  

  c++; //每访问一个子树的根都会使前序序号计数器加

  if(c==k)

  

  printf( Value is %d\\n T >data);

  exit ( );

  

  else

  

  Get_PreSeq(T >lchild); //在左子树中查找

  Get_PreSeq(T >rchild); //在右子树中查找

  

  //if

  //Get_PreSeq

  main()

  

  

  scanf( %d &k);

  c= ; //在主函数中调用前 要给计数器赋初值

  Get_PreSeq(T k);

  

  //main

  

  int LeafCount_BiTree(Bitree T)//求二叉树中叶子结点的数目

  

  if(!T) return ; //空树没有叶子

  else if(!T >lchild&&!T >rchild) return ; //叶子结点

  else return Leaf_Count(T >lchild)+Leaf_Count(T >rchild);//左子树的叶子数加上右子树的叶子数

  //LeafCount_BiTree

  

  void Bitree_Revolute(Bitree T)//交换所有结点的左右子树

  

  T >lchild< >T >rchild; //交换左右子树

  if(T >lchild) Bitree_Revolute(T >lchild);

  if(T >rchild) Bitree_Revolute(T >rchild); //左右子树再分别交换各自的左右子树

  //Bitree_Revolute

  

  int Get_Sub_Depth(Bitree T int x)//求二叉树中以值为x的结点为根的子树深度

  

  if(T >data==x)

  

  printf( %d\\n Get_Depth(T)); //找到了值为x的结点 求其深度

  exit ;

  

  else

  

  if(T >lchild) Get_Sub_Depth(T >lchild x);

  if(T >rchild) Get_Sub_Depth(T >rchild x); //在左右子树中继续寻找

  

  //Get_Sub_Depth

  int Get_Depth(Bitree T)//求子树深度的递归算法

  

  if(!T) return ;

  else

  

  m=Get_Depth(T >lchild);

  n=Get_Depth(T >rchild);

  return (m>n?m:n)+ ;

  

  //Get_Depth

  

  void Del_Sub_x(Bitree T int x)//删除所有以元素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

  

  void Bitree_Copy_Nonrecursive(Bitree T Bitree &U)//非递归复制二叉树

  

  InitStack(S );InitStack(S );

  push(S T); //根指针进栈

  U=(BTNode*)malloc(sizeof(BTNode));

  U >data=T >data;

相关参考

知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第八章答案

  第八章动态存储管理    typedefstruct  char*start;  intsize;  fmblock;//空闲块类型  char*Malloc_Fdlf(intn)//遵循最后分配

知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第九章答案

  第九章查找    intSearch_Sq(SSTableSTintkey)//在有序表上顺序查找的算法监视哨设在高下标端    STelem[STlength+]key=key;  for(i=

知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第五章答案

  第五章数组和广义表    voidRSh(intA[n]intk)//把数组A的元素循环右移k位只用一个辅助存储空间    for(i=;i<=k;i++)  if(n%i==&&a

知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第三章参考答案

  第三章栈与队列    typedefstruct  Elemtype*base[];  Elemtype*top[];  BDStacktype;//双向栈类型  StatusInit_Stack

知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第四章答案

  第四章串    voidString_Reverse(StringtypesStringtype&r)//求s的逆串r    StrAssign(r);//初始化r为空串  for(i=S

知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第七章答案

  第七章图    StatusBuild_AdjList(ALGraph&G)//输入有向图的顶点数边数顶点信息和边的信息建立邻接表    InitALGraph(G);  scanf(%d

知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第二章参考答案

  第二章线性表    StatusDeleteK(SqList&aintiintk)//删除线性表a中第i个元素起的k个元素    if(i<||k<||i+k>aleng

知识大全 数据结构备考[4]

  四参考资料  目前国内数据结构教材的版本有PascalCC++Java多但C语言版本的教材是使用最广的教材虽然考试大纲还没有出来但基本上可以确定的教材是清华大学出版社出版严蔚敏等著的《数据结构(C

知识大全 数据结构与算法线性表复习习题6[3]

      假设在算法描述语言中引入指针的二元运算异或若a和b为指针则a⊕b的运算结果仍为原指针类型且  a⊕(a⊕b)=(a⊕a)⊕b=b