二叉树的补充:
线索二叉树:
1.引入线索二叉树
二叉树的遍历实质上是对一个非线性结构实现线性化的过程,使每一个节点(除第一个和最后一个外)在这些线性序列中有且仅有一个直接前驱和直接后继。但在二叉链表存储结构中,只能找到一个节点的左、右孩子信息,而不能直接得到节点在任一遍历序列中的前驱和后继信息。这些信息只有在遍历的动态过程中才能得到,因此,引入线索二叉树来保存这些从动态过程中得到的信息。
2.建立线索二叉树
为了保存节点在任一序列中的前驱和后继信息,可以考虑在每一个节点中增加两个指针域存放遍历时得到的前驱和后继信息,这样就可以为以后的访问带来方便。但增加指针信息会降低存储空间的利用率,因此可考虑采用其他办法。
若N个节点的二叉树采用二叉链表作存储结构,则链表中必然有N+1个空指针域,可以充分利用这些空指针域来存放节点的前驱和后继信息。
3.访问线索二叉树
以中序线索二叉树为例,令P所指节点的某个节点。查找p所指节点的后继点的方法:
(1)若p->rtag==1,则p->rchild指向其后继节
(2)若p->rtag==0,则p所指节点的中序后继必然是其右子树中进行中序遍历时得到的第一个节点。也就是说,从p所指节点的右子树的根节点出发,沿左孩子指针链向下查找,直到找到一个没有左孩子的节点时为止,这个节点就是p所指节点的直接后继节点,也称其为p的右子树中”最左下”的节点。
以中序线索二叉树为例,令P所指节点的某个节点。查找p所指节点直接前驱方法:
(1)若p->ltag==1,则p->lchild指向其前驱节点
(2)若p->ltag==0,则p所指节点的中序前驱必然是其右子树中进行中序遍历时得到的最后一个节点。也就是说,从p所指节点的右子树的根节点出发,沿右孩子指针链向下查找,直到找到一个没有右孩子的节点时为止,这个节点就是p所指节点的直接前驱节点,也称其为p的右子树中”最右下”的节点。
树、森林和二叉树的转换:
树转换为二叉树
(1)加线。在所有兄弟结点之间加一条连线。
(2)去线。树中的每个结点,只保留它与第一个孩子结点的连线,删除它与其它孩子结点之间的连线。
(3)层次调整。以树的根节点为轴心,将整棵树顺时针旋转一定角度,使之结构层次分明。(注意第一个孩子是结点的左孩子,兄弟转换过来的孩子是结点的右孩子)
森林转换为二叉树
(1)把每棵树转换为二叉树。
(2)第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树的根结点的右孩子,用线连接起来。
二叉树转换为树
是树转换为二叉树的逆过程。
(1)加线。若某结点X的左孩子结点存在,则将这个左孩子的右孩子结点、右孩子的右孩子结点、右孩子的右孩子的右孩子结点…,都作为结点X的孩子。将结点X与这些右孩子结点用线连接起来。
(2)去线。删除原二叉树中所有结点与其右孩子结点的连线。
二叉树转换为森林
假如一棵二叉树的根节点有右孩子,则这棵二叉树能够转换为森林,否则将转换为一棵树。
(1)从根节点开始,若右孩子存在,则把与右孩子结点的连线删除。再查看分离后的二叉树,若其根节点的右孩子存在,则连线删除…。直到所有这些根节点与右孩子的连线都删除为止。
(2)将每棵分离后的二叉树转换为树。
(3)层次调整。
原文地址:https://www.cnblogs.com/bibabo/p/9379192.html