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

#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;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值