本文主要是介绍[树] 求树(孩子链表)的深度 与其他基本操作(严蔚敏《数据结构》6.63),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目来源:严蔚敏《数据结构》C语言版本习题册 6.63
【题目】对以孩子链表表示的树编写计算树的深度的算法
【答案】
/*-------------------------|6.63 求树的深度 |-------------------------*/
int SubTreeDepth(CTree T, int index) { //序号为index的子树深度int max=-1; //孩子的最大深度int sd; //孩子的深度CNode *p;if (!T.nodes[index].firstchild) return 1; //没有孩子,深度为1for (p=T.nodes[index].firstchild; p; p=p->next) { //遍历该结点的所有孩子sd = SubTreeDepth(T, p->index); //求孩子的深度if (max<sd) max=sd;}return max+1; //孩子的最大深度+1
}
int TreeDepth(CTree T) { return SubTreeDepth(T, T.r);
}
【其他基本操作】
// 树的层序次序+每个结点的度 --> 创建CTree
Status CreateCTreeByLevelDegree(CTree *pT,char *levelstr, int *degree) {CNode *c,*sibling;int parent;int i,cnt;//创建结点for (i=0; i<strlen(levelstr); ++i) {//赋值pT->nodes[i].data = levelstr[i];pT->nodes[i].firstchild = NULL;}pT->n=strlen(levelstr); //个数pT->r=0; //根结点//为孩子找爸爸parent=0; //当前的爸爸i=1; //遍历孩子cnt=0; //已经为parent找到了cnt个孩子while (i<strlen(levelstr)) {if (degree[parent]==0 || cnt==degree[parent]) { //parent没有孩子 || parent的孩子已经全部找到cnt=0;parent++;continue;}cnt++; //为parent找到了一个孩子//创建孩子结点c = (CNode *)malloc(sizeof(CNode)); if (!c) exit(OVERFLOW);c->index = i; //孩子的编号c->next = NULL;if (cnt==1) { //第一个孩子pT->nodes[parent].firstchild = c;} else { //不是第一个孩子for(sibling=pT->nodes[parent].firstchild; sibling->next; sibling=sibling->next) ;sibling->next = c;}i++;}return TRUE;
}
// 先根遍历
void SubPreOrder(CTree T, int index) {CNode *child;visit(T.nodes[index].data);for (child=T.nodes[index].firstchild; child; child=child->next)SubPreOrder(T, child->index);
}
void PreOrder(CTree T) {SubPreOrder(T, T.r);
}
【完整代码】
#include<stdio.h>
#include<stdlib.h>
#include<string.h>#ifndef BASE
#define BASE
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int bool;
#endif#define TElemType char
void visit(TElemType e) {printf("%c", e);
}
#define MAX_TREE_SIZE 100
#define maxSize 50typedef struct CNode{int index; //这个孩子的结点号(注意:在严书中变量名为child)struct CNode *next; //下一个孩子结点
}CNode, *ChildPtr; //孩子结点结构(在严书中名为CTNode)
typedef struct{TElemType data;CNode* firstchild;
}PNode; //双亲结点结构(在严书中,结构名为CTBox)
typedef struct{PNode nodes[MAX_TREE_SIZE];int n,r; //结点数 和 根结点的位置
}CTree; //树结构// 先根遍历
void SubPreOrder(CTree T, int index) {CNode *child;visit(T.nodes[index].data);for (child=T.nodes[index].firstchild; child; child=child->next)SubPreOrder(T, child->index);
}
void PreOrder(CTree T) {SubPreOrder(T, T.r);
}/*-------------------------|6.63 求树的深度 |-------------------------*/
int SubTreeDepth(CTree T, int index) { //序号为index的子树深度int max=-1; //孩子的最大深度int sd; //孩子的深度CNode *p;if (!T.nodes[index].firstchild) return 1; //没有孩子,深度为1for (p=T.nodes[index].firstchild; p; p=p->next) { //遍历该结点的所有孩子sd = SubTreeDepth(T, p->index); //求孩子的深度if (max<sd) max=sd;}return max+1; //孩子的最大深度+1
}
int TreeDepth(CTree T) { return SubTreeDepth(T, T.r);
}// 树的层序次序+每个结点的度 --> 创建CTree
Status CreateCTreeByLevelDegree(CTree *pT,char *levelstr, int *degree) {CNode *c,*sibling;int parent;int i,cnt;//创建结点for (i=0; i<strlen(levelstr); ++i) {//赋值pT->nodes[i].data = levelstr[i];pT->nodes[i].firstchild = NULL;}pT->n=strlen(levelstr); //个数pT->r=0; //根结点//为孩子找爸爸parent=0; //当前的爸爸i=1; //遍历孩子cnt=0; //已经为parent找到了cnt个孩子while (i<strlen(levelstr)) {if (degree[parent]==0 || cnt==degree[parent]) { //parent没有孩子 || parent的孩子已经全部找到cnt=0;parent++;continue;}cnt++; //为parent找到了一个孩子//创建孩子结点c = (CNode *)malloc(sizeof(CNode)); if (!c) exit(OVERFLOW);c->index = i; //孩子的编号c->next = NULL;if (cnt==1) { //第一个孩子pT->nodes[parent].firstchild = c;} else { //不是第一个孩子for(sibling=pT->nodes[parent].firstchild; sibling->next; sibling=sibling->next) ;sibling->next = c;}i++;}return TRUE;
}int main() {
/*6.63测试数据
RABCDEFGHI
3 2 0 1 0 0 3 0 0 0
*/CTree T;char levelstr[50];int num[50];int cnt;scanf("%s", levelstr);for (cnt=0; cnt<strlen(levelstr); cnt++) scanf("%d", &num[cnt]);CreateCTreeByLevelDegree(&T, levelstr, num);PreOrder(T);cnt = SubTreeDepth(T, T.r);printf("\nSubTreeDepth:%d\n", cnt);return 0;
}
这篇关于[树] 求树(孩子链表)的深度 与其他基本操作(严蔚敏《数据结构》6.63)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!