树的学习2.0

树的逻辑结构

树的逻辑结构表示有:树状表示法,文氏图表示法,凹入表示法和括号表示法。

树状表示法:

树是最基本的逻辑结构表示法,使用一棵树倒置表示,非常直观。

.文氏图标表示法:

使用集合以及集合包含关系描述树结构

凹入表示法:

使用线段的伸缩的关系描述树结构4.括号表示法:

 

孩子表示法

刚刚的双亲表示法,因为没有存储孩子结点的位置,所以找孩子结点比较麻烦,于是前辈们又想出来了另外一种方法,叫孩子表示法,这种方法融合了顺序存储与链式存储结构,可以很快的找到孩

#include<stdio.h>
#include<stdlib.h>
 
typedef struct LinkList 
{
	int data;//存放数据
	struct LinkList* next;
}Node;
 
Node* node[10];//存储结点的数组
int size;//数组中元素的个数
int maxsize;
 
void init(int);//初始化操作
void insert(int, int);//构建树
int find(int);//找到父节点
 
void init(int n)
{
	size = 0;
	maxsize = 10;
	//其实生成一个new_node,然后再赋值给数组也行
	node[size] = (Node*)malloc(sizeof(Node));
	node[size]->data = n;
	node[size]->next = NULL;//根节点暂时没有孩子,next为空
	size++;
}
int find(int p)
{
	for (int i = 0; i < size; i++)
	{
		if (p == node[i]->data)
			return i;
	}
	return -1;
}
 
/*将数据n插入到结点p下面*/
//即将n作为p的孩子结点
void insert(int n, int p)
{
	if (size == maxsize)
	{
		printf("已存满,插入失败\n");
	}
	else
	{
		int i = find(p);
		if (i != -1)
		{
			//先将孩子结点放入到数组中
			node[size] = (Node*)malloc(sizeof(Node));
			node[size]->data = n;
			node[size]->next = NULL;//此结点暂时没有孩子结点
			size++;
 
			//再将结点插入到父节点next中
			Node* new_node = (Node*)malloc(sizeof(Node));
			new_node->data = n;
			new_node->next = node[i]->next;//类似于头插法
			node[i]->next = new_node;//将新插入的孩子结点放在父节点后一个位置,即父节点原有孩子结点的前面
		}
		else
			printf("没有找到此父节点,插入失败\n");
	}
}
int main()
{
	init(1);
	insert(2, 1);
	insert(3, 1);
	insert(4, 1);
	insert(5, 2);
	insert(6, 2);
	insert(7, 3);
	for (int i = 0; i < size; i++)
	{
		printf("父节点为%d ", node[i]->data);
		Node* temp = node[i]->next;
		while (temp != NULL)
		{
			printf("孩子结点为%d ", temp->data);
			temp = temp->next;
		}
		printf("\n");
	}
}

子们。

3.孩子兄弟表示法

添加根节点1,其孩子、兄弟指针域为空;
添加结点2,其父节点为

typedef struct ChildSibling {
	int data;//当前结点的数据
	struct ChildSibling* child;//指向孩子的指针
	struct ChildSibling* sibling;//指向兄弟的指针
}Node;
Node* get_node(Node* node, int parent)
{
	if (node->data == parent)
	{
		return node;
	}
	if (node->child != NULL)
	{
		get_node(node->child, parent);
	}
	if (node->sibling != NULL)
	{
		get_node(node->sibling, parent);
	}
	return NULL;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值