知识大全 第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);//遍历右子树
相关参考
假设在树中结点x是结点y的双亲时用(xy)来表示树边已知一棵树边的集合为(im)(in)(ei)(be)(bd)(ab)(gj)(gk)(cg)(cf)(hl)(ch)(ac)用树形表示法出此树并回答
将哨兵放在R[n]中被排序的记录放在R[n]中重写直接插入排序算法解 重写的算法如下 voidInsertSort(SeqListR) //对顺序表中记录
假设在树中结点x是结点y的双亲时用(xy)来表示树边已知一棵树边的集合为(im)(in)(ei)(be)(bd)(ab)(gj)(gk)(cg)(cf)(hl)(ch)(ac)用树形表示法出此树并回答
试在无向图的邻接矩阵和邻接链表上实现如下算法 ()往图中插入一个顶点 ()往图中插入一条边 ()删去图中某顶点 ()删去图中某条边下面的伪代码是一个广度优先搜索算法试以图(下图)中的v为源点
将哨兵放在R[n]中被排序的记录放在R[n]中重写直接插入排序算法以单链表作为存储结构实现直接插入排序算法 设计一算法使得在尽可能少的时间内重排数组将所有取负值的关键字放在所有取非负值的关键
知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第六章答案
第六章树和二叉树 intIs_Descendant_C(intuintv)//在孩子存储结构上判断u是否v的子孙是则返回否则返回 if(u==v)return; else if
以关键字序列()为例分别写出执行以下排序算法的各趟排序结束时关键字序列的状态 ()直接插入排序()希尔排序()冒泡排序()快速排序 ()直接选择排序()堆排序()归并排序()基数排序 上述方法中哪些
知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第十章答案
第九章查找第十章内部排序 voidInsert_Sort(SqList&L)//监视哨设在高下标端的插入排序算法 k=Llength; for(i=k;i;i)//从后向前逐
二算法设计题 将哨兵放在R[n]中被排序的记录放在R[n]中重写直接插入排序算法 解重写的算法如下因为哨兵换了位置所以一切都反向了有序区是从右边长出来的; voidInsertSort(Se
二算法设计题 二叉树的遍历算法可写为通用形式例如通用的中序遍历为 voidInorder(BinTreeTvoid(*visit)(DataTypex)) if(T) Inorder(T&