树的特性:
1)一棵树中的任意两个结点有且仅有唯一的一条路径连通;
2)一棵树如果有nn个结点,则它一定有n−1n−1条边;
3)在一棵树中加一条边将会构成一个回路。
1、二叉树:
二叉树是一种特殊的树,二叉树的特点是每个结点最多有两个儿子。
二叉树使用范围最广,一颗多叉树也可以转化为二叉树。
(1)满二叉树:
二叉树中每个内部节点都有两个儿子。满二叉树所有的叶节点都有相同的深度。
满二叉树是一棵深度为h且有2h−12h−1个结点的二叉树。
完全二叉树:
若设二叉树的高度为hh,除了第hh层外,其他层的结点数都达到最大个数,第h层从右向左连续 缺若干个结点,则为完全二叉树。
特点:
1)如果一棵完全二叉树的父节点编号为KK,则其左儿子的编号是2K2K,右儿子的结点编号为2K+12K+1,
公式总结:
2)已知完全二叉树的总节点数为n求叶子节点个数:
当n为奇数时:(n+1)/2
当n为偶数时 : (n)/2
3)已知完全二叉树的总节点数为n求父节点个数:为:n/2
4)已知完全二叉树的总节点数为n求叶子节点为2的父节点个数:
当n为奇数时:n/2
当n为偶数时 : n/2-1
5)如果一棵完全二叉树有N个结点,那么这棵二叉树的深度为【log2(N+1)log2(N+1)】(向上取整)
2、堆——神奇的优先队列
堆是一种特殊的完全二叉树。
1)完全二叉树——数组存储表示(按照层次遍历的方式,结点编号为 ii 的结点的左子结点编号为 2∗i2∗i , 右子结点编号为 2∗i+12∗i+1. )
2)一般二叉树(尤其是形态剧烈变化的二叉树)——链表表示。
3)层次遍历的二叉树——队列。
二叉链表:二叉树的结点至少包含三个域,分别存放节点的数据data,左结点指针leftchild, 和 右结点指针rightchild.这种链表结构称为二叉链表。——缺点:难以找到父结点。
三叉链表: 比二叉链表多一个父指针域parent. 称为三叉链表。
二叉树的三叉链表表示示意图:
二叉树的链式储存:
#define datatype char //定义二叉树元素的数据类型为字符
typedef struct node //定义结点由数据域,左右指针组成
{ Datatype data;
struct node *lchild,*rchild;
}Bitree;