数据结构 六、树

一、树的定义

树是由结点或顶点和边组成的(可能是非线性的)且不存在着任何环的一种数据结构。没有结点的树称为空(null或empty)树。一棵非空的树包括一个根结点,还(很可能)有多个附加结点,所有结点构成一个多级分层结构。

二、树的存储结构

双亲表示法:
在每个结点中,附设一个指示器指示其双亲节点到链表中的位置,根节点的位置域设置为-1;

int telemtype;
struct ptnode //节点结构
{
	telemtype data;//节点数据
	int parent;
} ;

struct //树结构
{
	ptnode nodes[max_tree_size];//节点数组
	int r,n;//根的位置和节点数
}ptree;

孩子表示法:
把每个节点的孩子节点排列起来,以单链表作存储结构,若为叶子节点则为空。

struct ctnode//孩子节点
{
	int child;
	struct ctnode *next;
}*childptr

struct//表头结构
{
	telemtype data;
	childptr firstchild;
}ctbox;
struct//树结构
{
	ctbox nodes[max_tree_size];
	int r,n;
}ctree

孩子兄弟表示法
任意一棵树,它的节点的第一个孩子如果存在就是唯一的,他的右兄弟如果存在也是唯一的。因此,我们设置两个指针,分别指向该节点第一个孩子和此节点的兄弟

struct csnode
{
	telemtype data;
	struct csnode *firstchild,*rightsib;
}csnode,*cstree

三、二叉树的定义

或者为空集,或者由一个根节点和两颗互不相交的,分别称为根节点的左子树和右子树的二叉树组成

四、二叉树特殊特点

1.特点
每个节点最多有两颗子树
左子树和右子树是有顺序的
即使树中某节点只有一颗子树,也要区分它是左子树还是右子树
2.五种基本形态

只有一个根节点
根节点只有左子树
根节点只有右子树
根节点既有左子树和右子树

五、特殊的二叉树

斜树(左斜树,右斜树)
满二叉树
完全二叉树(没有空挡编号)

六、二叉树的性质

1.在二叉树的第i层上至多有 2i-1 个结点(i ≥ 1)。

2.高度为h的二叉树上最多有2h-1个结点(h≥1)。

3.任意一棵二叉树中,若叶子结点的个数为n0,度为1的结点的个数为n1,度为2的结点的个数为n2,则有n0=n2+1。
4.包含n个结点的二叉树的高度值最小为┍ log2(n+1) ┑(向上取整),最大为n。

七、遍历二叉树

前序遍历:
preordertraverse(bitree t)
{
if(n==null)
return;

printf("%c",t->data);
preordertraverse(t->lchild)
preordertraverse(t->rchild)

}
中序遍历
后序遍历

(区别在于print的位置不同)

八、二叉树的建立

void createbitree(bitree *t)
{
	telemtype data;
	scanf("%c",&ch);
	if(ch==#)
		*t=null
	else
	{
		*t=(bitree)malloc(sizeof(bitnode));
		if(!*t)
			exit(overflow)
		(*t)->data=ch;
		creatbitree(&(*t)->lchild)
		creatbitree(&(*t)->rchild)
	}
}

九、线索二叉树

typedef enum{link,thread} pointertag;

typedef struct bithrnode
{
	telemtype data;
	struct bthrnode *lchild,*rchild;
	pointertag ltag;
	pointertag rtag;
}bithrnode,*bithrtree

十、树、森林与二叉树的转换
十一、赫夫曼树及其应用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值