删除和插入要对比一起看,因为总体策略是一样的:分类讨论各中情况,利用转化的思想转化为可以解决的情况;或者把出现违背红黑性质的节点向上移。
第二次看红黑色删除:
首先是二叉树的删除,分类讨论的思想,情况d)运用了转化的思想(转化为右孩子y是其后继)。
y原来的颜色也是一个分类讨论的思想。
调整过程:首先是一个分类讨论的思想:各类情况中运行了转化的思想(红兄转化为黑兄,转化为右孩红),对称图形的知识(双色节点x是左孩子还是右孩子)。
双色节点x是右孩子:
第二次看二叉树的插入
分析出插入后红黑性质有那些不能继续保持后。利用循环不变式(a)节点z是红色的;b)如果p.z是根,则p.z是黑色的;c)如果有红黑性质的破坏,则至多只有一个被破坏,并且不是性质2就是性质4. 循环结束时是因为p.z是黑的)
调整过程:首先是一个分类讨论的思想:各类情况中运行了转化的思想(转化为z是左孩红),对称图形的知识(分p.z是左孩子还是右孩子)。
p.z是右孩子
根据性质和循环不变式来学习算法
二叉查找树的性质,红黑树的性质。
二叉树必须有两个指向其孩子的链接(即指针),还有一个指向其父亲的链接(这个链接是可选的,不过我们发现有了它,有些树算法
实现起来更为容易),另外还要有在节点中存储的实际数据。TChildType =(ctLeft,ctRight);
PTreeNode = ^RTreeNode;
RTreeNode = record
parent :PTreeNode;
Child:array[TChildType] of PTreeNode;
Data: point;
end
我们将两个孩子链接定义为一个二元数组。起先这看上去可能是小题大做,
但是在具体的实现二叉树操作是,这一定义将使之更加简单。
在实际应用中,我们趋向于使用一个虚拟节点,它类似于单链表中的虚拟头节点,这样树种每一个实际节点都
有一个父节点,其中包括根. 根节点可以是此虚拟头节点的左孩子,也可能是其右孩子,不过在此我们做一个
规定,即根总是虚拟头节点的左孩子。
删除节点:删除的是叶子节点;删除的节点只有一个孩子;删除的节点有两个孩子(二叉树无法删除,它的变种二差查找树无此限制)
二叉树的遍历(先序,中序,后序(引用最多),层序(理解最容易,代码最复杂))
先,后,中序遍历,是指针对根节点来说的,指访问根节点和访问两边子树的顺序比,是放在先,还是放在后,还是放在中间
【中序遍历和后序遍历】跟先序遍历比较,不同在与标记该节点已经见过
中序遍历:
后序遍历
层序遍历
二叉树的递归定义:二叉树包括一个根节点,该节点带有指向另外两颗二叉树根节点的指针。
二叉查找树的性质:对于任何节点而言,位于左子树的所有关键字都小于或等于节点的关键字,而右子树的所有关键字则要大于或等于节点的关键字
红黑树
红黑树应用