对于任意N>0的非空树
包含根节点(Root)
其余节点可分为M个互不相交的有限集,其中每个集合本身又是原来树的子树
结点的度(Degree):结点的子树个数
树的度:树的所有结点中最大的度数
叶结点:度数为零的结点
父结点,子结点
兄弟结点(Sibling):具有同一父结点的各结点彼此是兄弟结点
祖先结点(Ancestor):沿根结点到某一结点的所有结点都是这个结点的祖先结点
子孙结点(Descendant):某一结点子树中的所有结点
结点的层次(Level):根节点在1层,其他结点层数是父结点层数+1
树的深度(Depth):树的所有节点中最大层次是这棵树的深度
判定树上每个节点需要查找的次数刚好是该节点所在层数
查找次数不会超过判定树的深度,N个节点的判定树深度[Log?N]+1
四层满二叉树的平均查找成功次数:ASL=(84+43+2*2+1)/15=3
1.4.1 右边顺时针旋转45°就是一课二叉树
斜二叉树
完美二叉树/满二叉树
完全二叉树
深度为k的二叉树有最大结点总数
第i层最大结点树是
任何非空二叉树【 叶结点的个数 = 度为2的非叶节点的个数+1 】
边数=n。+ n? + n? - 1
2.3.4 二叉树的高度
一个二叉树的高度等于其左右子树中的最大高度的+1:Height=max(H左,H右)+1
用后序遍历递归取得左右子树的高度
由两种遍历序列可以确定二叉树,已知中有中序
二叉树BinTree,树结点元素ElementType
Boolean IsEmpty(BinTree BT); //判断BT是否为空
BinTree CreatBinTree(); //创建一个二叉树
void OverTraversal(BinTree BT); //遍历,按某种顺序访问每个结点
常用的遍历方法有先序,中序,后序,层次遍历(上到下,左到右)
第i个元素的父结点下标i/2
第i个元素的左子节点下标2i,右儿子结点的下标2i+1
缺点:二叉树需要构建成完全二叉树,会造成大量空间浪费
静态链表表示方法
根在T[1]:判断left和right中没用到的下标(1)
2.6.1 前中后序遍历
2.6.2 非递归堆栈实现前中后序遍历
2.6.3 队列实现层序遍历
若是按层输出则还需判断每一层的最右节点,如下
void LevelorderTraversal ( BinTree BT )//队列实现二叉树层序遍历
{
Queue Q;
BinTree T;
BinTree last=BT;
BinTree nolast=BT;
if ( !BT ) return; // 若是空树则直接返回
Q = CreateQueue(MAXSIZE); // 创建空队列Q
AddQ( Q, BT );
//每次循环从队列里出队一个元素并且把这个元素的左右儿子放入队列,重复这过程
while ( !IsEmpty(Q) )
{
T = DeleteQ( Q );
printf("%d ", T->Data); //访问取出队列的结点
if ( T->Left )
{
AddQ( Q, T->Left );
nolast=T->Left;
}
if ( T->Right )
{
AddQ( Q, T->Right );
nolast = T->Right;
}
if(last == T)
{
printf("\n");
last=nolast;
}
}
}
2.7.1 叶结点运算数非叶结点运算符号
2.7.2 中序受运算符优先级影响不准(输出左右子树时加括号)
3.1.1 定义结构
3.2.1 FindMin
3.2.2 FindMax
4.4.1 LL旋转,LR旋转,RR旋转,RL旋转等一系列保持平衡操作
结点是红色或黑色
根节点是黑色
每个叶节点(也叫NIL结点,空节点)是黑色的
每个红色结点的两个子结点都是黑色的
从任意结点到其每个叶子(子孙叶节点)的所有路径都包含相同数目的黑色结点
总结:有红必有黑,有黑不一定有红(每个红色结点的两个子结点都是黑色的, 从任意结点到其每个叶子(子孙叶节点)的所有路径都包含相同数目的黑色结点)
最坏运行时间也良好O(LogN)
插入相同于AVL最多两次旋转,删除优于AVL最多三次旋转,大量插入删除时不用频繁rebalance
虽然AVL高度平衡,查找效率更高,大量插入删除频繁rebalance
原文:https://www.cnblogs.com/binjz/p/12501337.html