n叉树 数据结构

树:
树有多种: 二叉树, 三叉树, 四叉树....n叉树.
每一个树中的元素, 称为树的节点,
起始元素称为根节点,
显示了一个层次关系的集合.
每一个层次之间又形成了新的子树.

树的重要概念
1.> 度:  节点的子树个数叫做这个节点的度.

2.> 叶子(终端节点): 度为0的节点称作是叶子, 通
俗的说就是这个节点没有子树了, 那这个节点就是一片叶子.

3.> 分支节点: 就是度不为0的节点叫做分支节点, 通俗的说
就是每一个包含有子树的节点就是分支节点.

4.> 不管是哪一种树, 都会有父亲节点, 孩子节点以及兄弟节点.

5.> 祖先节点/孙子节点, 从某一个树(子树)的根节点到该节点所经过的分支上的所有节点.

6.> 节点的层次: 从根节点开始算起, 根节点为第一层, 根的孩子为第二层.

7.> 深度: 从根到树的最大层次叫做深度(高度), 简单来说从根算起到他的最后一个孙子
所在的层次.

8.> 有序树: 从左到右的子树有次序, 否则就是无序树.

9.> 森林: 互不相交的树的一个集合.

定义部分:

struct TreeNode;
// 新建节点初始化
static struct TreeNode* InitTreeNode(int id, const char* name, int grade, const char* class);
// 树节点插入头
static struct TreeNode* InsertTreeNodeHead(struct TreeNode* root, struct TreeNode* node);
static void InsertTreeNodeHead_ptrToptr(struct TreeNode** root, struct TreeNode* node);
// 树节点插入尾
static struct TreeNode* InsertTreeNodeTail(struct TreeNode* root, struct TreeNode* node);
static void InsertTreeNodeTail_ptrToptr(struct TreeNode** root, struct TreeNode* node);
// 移除树
static void RemoveTree(struct TreeNode* node);
// 树遍历
static void TransTree(struct TreeNode* root);
static void DeleteTranser(struct TreeNode* node);

树结构以及初始化描述部分:

// 树的单个节点结构
struct TreeNode {
	// 数据部分
	int s_id;
	char s_name[10];
	int s_grade;
	char s_class[20];

	// 结构部分
	struct TreeNode* parent;
	struct TreeNode* brother;
	struct TreeNode* child;
};

static struct TreeNode*
InitTreeNode(int id,
		const char* name,
		int grade,
		const char* class) {
	struct TreeNode* s_node = malloc(sizeof(struct TreeNode));
	memset(s_node, 0, sizeof(struct TreeNode));
	
	strcpy(s_node->s_name, name);
	s_node->s_id = id;
	s_node->s_grade = grade;
	strcpy(s_node->s_class, class);
	return s_node;
}

插入实现部分:

// 两种头插方式
static struct TreeNode*
InsertTreeNodeHead(struct TreeNode* root, struct TreeNode* node) {
	node->parent = root;
	node->brother = root->child;
	root->child = node;
	return root;
}

static void 
InsertTreeNodeHead_ptrToptr(struct TreeNode** root, struct TreeNode* node) {
	node->parent = *root;
	node->brother = (*root)->child;
	(*root)->child = node;
}

// 两种尾插方式
static struct TreeNode*
InsertTreeNodeTail(struct TreeNode* root, struct TreeNode* node) {
	node->parent = root;
	struct TreeNode* transer = root->child;
	while (transer->brother) {
		transer = transer->brother;
	}
	transer->brother = node;
	return root;
}

static void
InsertTreeNodeTail_ptrToptr(struct TreeNode** root, struct TreeNode* node) {
	node->parent = *root;
	struct TreeNode** transer = &(*root)->child;
	while (*transer) {
		transer = &(*transer)->brother;
	}
	*transer = node;
}

树的遍历描述部分:

static void 
TransTree(struct TreeNode* root) {
	struct TreeNode* transer = root;
	while (transer) {
		printf("%d %s %d %s 0x%x\n", transer->s_id, transer->s_name, transer->s_grade, transer->s_class, transer->parent);
		TransTree(transer->child);
		transer = transer->brother;
	}
}

树的移除描述部分:

static void 
RemoveTree(struct TreeNode* node) {
	struct TreeNode* Parent = node->parent;
	struct TreeNode** transer = &(Parent->child);
	while (*transer) {
		if (*transer == node) {
			DeleteTranser(*transer);
			*transer = (*transer)->brother;
			return;
		}
		transer = &(*transer)->brother;
	}
}

static void
DeleteTranser(struct TreeNode* node) {
	struct TreeNode* transer = node;
	while (transer) {
		struct TreeNode* currentNode = transer;
		DeleteTranser(transer->child);
		if (transer == node) {
			return;
		}
		transer = transer->brother;
		currentNode->child = NULL;
		currentNode->brother = NULL;
		currentNode->parent = NULL;
		free(currentNode);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值