二叉树

来源:互联网 发布:2016年破获的网络诈骗 编辑:程序博客网 时间:2024/06/05 13:26

删除和插入要对比一起看,因为总体策略是一样的:分类讨论各中情况,利用转化的思想转化为可以解决的情况;或者把出现违背红黑性质的节点向上移。

第二次看红黑色删除:

首先是二叉树的删除,分类讨论的思想,情况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
我们将两个孩子链接定义为一个二元数组。起先这看上去可能是小题大做,
但是在具体的实现二叉树操作是,这一定义将使之更加简单。




  在实际应用中,我们趋向于使用一个虚拟节点,它类似于单链表中的虚拟头节点,这样树种每一个实际节点都
有一个父节点,其中包括根. 根节点可以是此虚拟头节点的左孩子,也可能是其右孩子,不过在此我们做一个
规定,即根总是虚拟头节点的左孩子。


删除节点:删除的是叶子节点;删除的节点只有一个孩子;删除的节点有两个孩子(二叉树无法删除,它的变种二差查找树无此限制)




二叉树的遍历(先序,中序,后序(引用最多),层序(理解最容易,代码最复杂))

先,后,中序遍历,是指针对根节点来说的,指访问根节点和访问两边子树的顺序比,是放在先,还是放在后,还是放在中间

【中序遍历和后序遍历】跟先序遍历比较,不同在与标记该节点已经见过


中序遍历:



后序遍历



层序遍历


二叉树的递归定义:二叉树包括一个根节点,该节点带有指向另外两颗二叉树根节点的指针。


二叉查找树的性质:对于任何节点而言,位于左子树的所有关键字都小于或等于节点的关键字,而右子树的所有关键字则要大于或等于节点的关键字


红黑树




红黑树应用


0 0
原创粉丝点击