| Lnode | Ltag | Data | Rtag | Rnode |

using System;
using System.Collections.Generic;
using System.Text;
/**//*
作者:旋风
日期:2006-9-29
博客园主页:http://xuanfeng.cnblogs.com
内容:线索二叉树
*/
namespace LineNode

{

class Program
{
二叉链表结点数据结构的定义#region 二叉链表结点数据结构的定义
class LineNodes<T>
{
T data;
LineNodes<T> lNode, rNode;
int lTag, rTag;
public LineNodes(T data)
{
this.data = data;
}
public T Data
{
set
{
data = value;
}
get
{
return data;
}
}
public LineNodes<T> Lnode
{
set
{
lNode = value;
}
get
{
return lNode;
}
}
public LineNodes<T> Rnode
{
set
{
rNode = value;
}
get
{
return rNode;
}
}
public
{
set
{
lTag = value;
}
get
{
return rTag;
}
}
public
{
set
{
rTag = value;
}
get
{
return rTag;
}
}
}
#endregion

构造一颗已知的线索二叉树#region 构造一颗已知的线索二叉树
static LineNodes<string> GetLineTree()
{
LineNodes<string>[] lineNodes =
lineNodes[0] =
lineNodes[1] =
lineNodes[2] =
lineNodes[3] =
lineNodes[4] =
lineNodes[5] =
lineNodes[6] =
lineNodes[7] =
lineNodes[8] =
lineNodes[0].Lnode = lineNodes[1];
lineNodes[0].Rnode = lineNodes[2];
lineNodes[1].Lnode = lineNodes[3];
lineNodes[1].Rnode = lineNodes[4];
lineNodes[2].Lnode = lineNodes[5];
lineNodes[2].Rnode = lineNodes[6];
lineNodes[4].Lnode = lineNodes[7];
lineNodes[4].Rnode = lineNodes[8];

return lineNodes[0];

}
#endregion

中序次序线索化算法#region 中序次序线索化算法
static LineNodes<string> preNode =

{
if (headNode !=
{
MidOrder(headNode.Lnode, headNode);
Console.WriteLine(headNode.Data);
if (headNode.Lnode !=
{
headNode.Ltag =
}
else
{
headNode.Ltag =
headNode.Lnode = preNode;
}

preNode = headNode;
MidOrder(headNode.Rnode, postNode);
if (headNode.Rnode !=
{
headNode.Rtag =
}
else
{
headNode.Rtag =
headNode.Rnode = postNode;
}


}
}
#endregion

在中根线索树上查找结点node的前驱结点#region 在中根线索树上查找结点node的前驱结点
static LineNodes<string> GetPreNode(LineNodes<string> node)
{
LineNodes<string> preNode =
if (node !=
{
if (node.Ltag ==
{
preNode = node.Lnode;
}
else
{
while (node.Rtag !=
{
node = node.Rnode;
}
preNode = node;
}
return preNode;
}
return
}
#endregion

在中根线索树上查找结点node的后继结点#region 在中根线索树上查找结点node的后继结点
static LineNodes<string> GetPostNode(LineNodes<string> node)
{
LineNodes<string> postNode;
if (node !=
{
if (node.Rtag ==
{
postNode = node.Rnode;
}
else
{
while (node.Lnode.Ltag !=
{
node = node.Lnode;
}
postNode = node;
}
return postNode;
}
return
}
#endregion


测试的主办法#region 测试的主办法
static
{ //得到已知二叉树的根结点
LineNodes<string> headNode = GetLineTree();
//中序线索化已知二叉树
MidOrder(headNode, headNode);
//测试,查找结点I的前驱
Console.WriteLine("结点I的线性前驱结点是:");//正确应该是:E
Console.WriteLine(GetPreNode(headNode.Lnode.Rnode.Rnode).Data);
Console.WriteLine("结点F的线性后继结点是:");//正确应该是C
Console.WriteLine(GetPostNode(headNode.Rnode.Lnode).Data);
Console.Read();
}
#endregion
}
}