用递归的方法求树的高度、度

来源:互联网 发布:申请网络预约出租车 编辑:程序博客网 时间:2024/06/05 12:00
#include "error.h"#include <stdio.h>#include <stdlib.h>//**!!此题需要给树链表和孩子链表,创建头节点;struct _treeNode; //事先申明;//孩子节点链表的类型;typedef struct _childNode{struct _treeNode *childNode;struct _childNode *next;}ChildNode;//树节点类型typedef char TreeData;typedef struct _treeNode{TreeData data;          struct _treeNode *parent;   //指向父节点的指针struct _treeNode *next;     //指向链表下一个节点的指针struct _childNode *childList; //孩子链表的头结点;int degree;                   //节点的度;}TreeNode;typedef struct _tree{struct _treeNode *head; //树链表的头结点;(我理解为指向整个树头结点的指针/指向树链表头结点的指针)int len;                //树节点个数;}Tree;//定义函数指针类型typedef void (*TreePrint)(TreeNode* node);//创建树;Tree *Create_Tree();//插入节点//pos 代表要插入节点父亲节点的位置//约定://1、新插入的节点插入在当前父亲节点所有孩子的右边;//2、根节点的位置是0;int Insert_Tree(Tree* tree,TreeData data,int pos);int Tree_Height(Tree* tree);int Tree_Degree(Tree* tree);-------------------------------------------------------int r_height(TreeNode* node){if(node == NULL){return 0;}int subHeight = 0;int max = 0;ChildNode* child = node->childList->next;while(child){subHeight = r_height(child->childNode);//等于遍历 ,子链表的子链表;一直到最底层;if(subHeight > max){max = subHeight;}child = child->next;}return max + 1;} int Tree_Height(Tree* tree) { if(tree == NULL) { errno = ERROR; return FALSE; }  int height = r_height(tree->head->next);  return height; }//度int r_degree(TreeNode* node){if(node == NULL)return 0;int max = node->degree;   //这个重要!!!结构体里面有包含每个节点度;int subDegree = 0;ChildNode* child = node->childList->next;while(child){subDegree =r_degree(child->childNode);if(subDegree > max)max = subDegree;child = child->next;}return max;}int Tree_Degree(Tree* tree){if(tree == NULL){errno = ERROR;return FALSE;}int degree = r_degree(tree->head->next);return degree;}--------------------------------------------------------int main(){Tree *tree = Create_Tree();if(tree == NULL){myError("Create_Tree");return -1;}//插入Insert_Tree(tree, 'A', 0);Insert_Tree(tree, 'B', 0);Insert_Tree(tree, 'C', 0);Insert_Tree(tree, 'D', 0);Insert_Tree(tree, 'E', 1);Insert_Tree(tree, 'F', 1);Insert_Tree(tree, 'H', 3);Insert_Tree(tree, 'I', 3);Insert_Tree(tree, 'J', 3);Insert_Tree(tree, 'X', 3);Insert_Tree(tree, 'Z', 8);Display(tree,PrintA);//printf("删除B :\n");TreeData x;//Delete(tree,1,&x);//删除树链表中第二个节点//Display(tree,PrintA);printf ("height = %d\n", Tree_Height(tree));printf ("degree = %d\n", Tree_Degree(tree));return 0;}