#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;
}
用递归的方法求树的高度、度
最新推荐文章于 2021-09-22 08:29:12 发布