树的基本定义、二叉树的性质、树与二叉树的转换和树的表示法

 

 

 

 

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

/*
	树的定义:
	(1)树是递归定义的
	(2)m个互不相交的有限集合
	
	术语:
		根
		叶子
		森林
		有序树
		无序树

    结点:树中的数据元素
	结点的度:结点拥有的子树数
	叶结点:度为0的结点
	树的度:树中各结点的度的最大值
	树的深度(高度):树中结点的最大层次(根节点算作第一层)

	树的表示法:
		(1)图形表示法
		(2)广义表表示法(重要)
		(3)左孩子-右兄弟表示法: 左为尊,长兄如父  将树转化为二叉树(叶子节点先以 左子树为主)

	树的存储结构:
		顺序存储
	 	链式存储

		定义2张表:
			结点表(序号id, data)
			结点关系表(序号父亲, 序号孩子)
	二叉树的定义:( 递归定义的)
	(1)每个节点最多只有两颗子树(不存在度大于2的结点)
	(2)左子树和右子树次序不能颠倒(有序树)
	3个节点的二叉树有多个形状 5种

	二叉树的性质:5条
	
	满二叉树:深度为k,且有[2的k次方 -1]个结点的二叉树
	完全二叉树:
		1、第k-1层和满二叉树一样
		2、最后一层叶子结点尽力靠左


*/

//二叉链表
typedef struct BiNode{
	int data;
	struct BiNode *lchild, *rchild;
}BiNode, *BiTree;

/*
			t1
		t2			t3
	t4			t5

*/
//二叉链表 表示法
void test01()
{
	BiNode t1, t2, t3, t4, t5;
	t1.data = 1;
	t2.data = 2;
	t3.data = 3;
	t4.data = 4;
	t5.data = 5;

	//建立树关系
	t1.lchild = &t2;//t1的左孩子为t2
	t1.rchild = &t3;//t1的右孩子为t3
	t2.lchild = &t4;//t2的左孩子为t4
	t3.lchild = &t5;//t3的左孩子为t5
}
//二叉链表 表示法 使用指针
void test02()
{
	BiTree t1, t2, t3, t4, t5;
	t1 = (BiTree)malloc(sizeof(BiNode));
	t2 = (BiTree)malloc(sizeof(BiNode));
	t3 = (BiTree)malloc(sizeof(BiNode));
	t4 = (BiTree)malloc(sizeof(BiNode));
	t5 = (BiTree)malloc(sizeof(BiNode));
	memset(t1, 0, sizeof(BiNode));
	memset(t2, 0, sizeof(BiNode));
	memset(t3, 0, sizeof(BiNode));
	memset(t4, 0, sizeof(BiNode));
	memset(t5, 0, sizeof(BiNode));

	t1->data = 1;
	t2->data = 2;
	t3->data = 3;
	t4->data = 4;
	t5->data = 5;

	//打造关系
	t1->lchild = t2;
	t1->rchild = t3;
	t2->lchild = t4;
	t3->lchild = t5;
}


//--------------------------------------
//三叉链表   不是重点
typedef struct TriNode
{
	int data;
	//左右孩子 指针
	struct TriNode *lchild, *rchild;
	struct TriNode *parent;
}TriTNode, *TriTree;

//-----------------------
//双亲链表 表示法  :子节点中保存了双亲的信息
#define MAX_TREE_SIZE 100
//使用数组存储节点之间的关系  节点表  关系表   id是数组的下标
typedef struct BPTNode{
	int data;
	int parentPosition; //指向双亲的指针 数组的下标 
	char LRTag;			//左右孩子标志域 左孩子:1  右孩子:2
}BPTNode;

typedef struct BPTree{
	BPTNode nodes[MAX_TREE_SIZE];//节点是分散的,需要把节点存储到数组中 (这里也可以使用链表)
	int num_node;	//节点数目
	int root;		//根结点的位置 //注意此域存储的是父亲节点在数组的下标
}BPTree;

void test03()
{
	BPTree tree;
	//根节点
	tree.nodes[0].parentPosition = 1000;//这个位置值随意定义,因为根节点没有双亲
	tree.nodes[0].data = 'A';

	//b
	tree.nodes[1].parentPosition = 0;
	tree.nodes[1].data = 'B';
	tree.nodes[1].LRTag = 1;

	//C
	tree.nodes[2].parentPosition = 0;
	tree.nodes[2].data = 'C';
	tree.nodes[2].LRTag = 2;

	//D
	tree.nodes[2].parentPosition = 1;
	tree.nodes[2].data = 'D';
	tree.nodes[2].LRTag = 1;

	//E
	tree.nodes[2].parentPosition = 1;
	tree.nodes[2].data = 'E';
	tree.nodes[2].LRTag = 2;

	//F
	tree.nodes[2].parentPosition = 2;
	tree.nodes[2].data = 'F';
	tree.nodes[2].LRTag = 1;
}

int main()
{
	test01();
	test02();
	test03();
	printf("hello\n");
	system("pause");
}






 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值