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