一、树的定义
树是由结点或顶点和边组成的(可能是非线性的)且不存在着任何环的一种数据结构。没有结点的树称为空(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
十、树、森林与二叉树的转换
十一、赫夫曼树及其应用