结构和名称
路径:从根到叶子的任意一条路径
路径长度:边的数目
度:对于一个结点,它的孩子的数量。
二叉树:
性质:
- 对于一颗满二叉树,若他有k层,则他的结点最多有2^k - 1个。
- 对于一颗满二叉树,若他有k层,则他的叶子最多有2^(k - 1)个。
- 度为0的点总比度为2的结点多一个。
- 对于一颗完全二叉树,n个结点的树有log(2, n)(向下取整) + 1层。
- 层序遍历一颗完全二叉树并从0开始标号,对于任意结点i,若其孩子存在,则它的左右孩子分别是2*i + 1, 2* i + 2,非叶子结点范围为0 ~ n / 2 - 1。
满二叉树
每一层的叶子都是满的
CBT 完全二叉树
- 树中只允许最后一层有空缺,并且其空缺方式从右向左连续空缺。
- 度为1的点只有0或1个
BST 二叉搜索树
对于任意节点,它的右子树的所有点都比它大,它的左子树的所有点都比它小。
AVL 二叉平衡搜索树
在BST的基础上,保证任意任意结点左右子树高度差不超过1。
RBT 红黑树
将结点标记为红色或黑色,并依照颜色之间的规则保证树的平衡。
B/B+树:多路平衡搜索树。
数据库、硬盘等多使用。
二叉树
二叉树的结构
typedef struct node {
int nValue;
struct node* left;
struct node* right;
}binarytree;
二叉树的三种递归遍历
void trav_front(binarytree now) { //前序遍历
if (now == nullptr) return;
printf("%d ", now->nValue);
trav_front(now->left);
trav_front(now->right);
}
void trav_mid(binarytree now) { //中序遍历
if (now == nullptr) return;
trav_mid(now->left);
printf("%d ", now->nValue);
trav_mid(now->right);
}
void trav_back(binarytree now) { //后序遍历
if (now == nullptr) return;
trav_back(now->left);
trav_back(now->right);
printf("%d ", now->nValue);
}
ps:已知中序遍历顺序和前序或后序遍历顺序的其中一个,便可还原出二叉树。
例子: