旋风

Communication comes from our hears and heads! my msn:youpeizun@hotmail.com


导航

线索二叉树(C# 2.0)

Posted on 2006-09-29 17:42  xuanfeng  阅读(6805)  评论(6编辑  收藏  举报
      线索二叉树主要是为了解决查找结点的线性前驱与后继不方便的难题。它只增加了两个标志性域,就可以充分利用没有左或右孩子的结点的左右孩子的存储空间来存放该结点的线性前驱结点与线性后继结点。两个标志性域所占用的空间是极少的,所有充分利用了二叉链表中空闲存的储空间。

   要实现线索二叉树,就必须定义二叉链表结点数据结构如下(定义请看代码):

Lnode

Ltag

Data

Rtag

Rnode

   

   说明:

1.       Ltag=0时,表示Lnode指向该结点的左孩子;

2.       Ltag=1时,表示Lnode指向该结点的线性前驱结点;

3.       Rtag=0时,表示Rnode指向该结点的右孩子;

4.       Rnode时,表示Rnode指向该结点的线性后继结点;

     以二叉链表结点数据结构所构成的二叉链表作为二叉树的存储结构,叫做线索二叉链表;指向结点的线性前驱或者线性后继结点的指针叫做线索;加上线索的二叉树称为线索二叉树;对二叉树以某种次序遍历将其变为线索二叉树的过程叫做线索化。

 

中序次序线索化二叉树算法:

  中序次序线索化是指用二叉链表结点数据结构建立二叉树的二叉链表,然后按照中序遍历的方法访问结点时建立线索;(具体看代码)

检索中序二叉树某结点的线性前驱结点的算法:

1.       如果该结点的Ltag=1,那么Lnode就是它的线性前驱;

2.       如果该结点的Ltag=0,那么该结点左子树最右边的尾结点就是它的线性前驱点;

(具体请看代码)

检索中序二叉树某结点的线性后继结点和算法:

1.       如果该结点的Rtag=1,那么Rnode就是它的线性后继结点;

2.       如果该结眯的Rtag=0,那么该结点右子树最左边的尾结点就是它的线性后继结点

(具体请看代码)

  解决方案中所有到二叉树的中序线索二叉树和中序线索链表的图




解决方案源码

二叉树中序线索算法解决方案

推荐看另一篇随笔:二叉树遍历算法实现(C#2.0)
http://www.cnblogs.com/xuanfeng/archive/2006/09/20/509897.html