二叉树的建立:
/* 按前序输入二叉树中结点的值 */
/* #表述空树,构造二叉链表表示二叉树T */
void CreateBiTree( BiTree *T )
{
TElemType ch;
scanf("%c", &ch);
if (ch == '#') *T=NULL;
else
{
*T = (BiTree) malloc(sizeof(BiTNode));
if (!T) exit(OVERFLOW);
(*T)->data = ch;
CreateBiTree(& (*T)->lchild);
CreatEBiTree(& (*T)->rchild);
}
}
当然可以按中序或后序遍历的方式实现二叉树的建立,只需把代码里生成结点和构造左右子树的代码顺序交换一下。
对二叉树以某种次序遍历使其变为线索二叉树的过程:线索化。
线索二叉树结构实现:
/* 二叉树的二叉线索存储结构定义 */
typedef enum {Link, thread} PointerTag;
typedef struct BiThrNode
{
TElemType data;
struct BiThrNode *lchild, *rchild;
PointerTag LTag;
PointerTag RTag;
} BiThrNode, *BiThrTree;
中序遍历进行中序线索化:
BiThrTree pre;
void InThreading( BiThrTree p)
{
if (p)
{
InThreading(p->lchild); /* 递归左子树线索化 */
if (!p->lchild) /* 如果p没有左孩子 */
{
p->LTag = Thread; /* 前驱线索 */
p->lchild = pre; /* p的左孩子指针指向前驱 */
}
if (!pre->rchild) /* 如果前驱pre没有右孩子 */
{
pre->RTag = Thread; /* 后继线索 */
pre->rchild = p; /* 前驱的右孩子指针指向后继(当前结点是p) */
}
pre = p; /* 保持 pre 指向p 的前驱 */
InThreading(p->rchild); /* 递归右子树线索化 */
}
}
中序遍历二叉线索链表(假设了结点中Tag和左右孩子都已经填写好了):
Status InOrderTraverse_Thr(BiThrTree T)
{
BiThrTree p;
p = T->lchild; /* p指向根结点 */
while (p != T) /* 空树或遍历结束时,p==T */
{
while (p->LTag == Link) /* 当LTag==0时,需要循环到中序序列第一个结点 */
p = p->lchild;
printf("%c", p->data); /* 显示结点数据,可以更改为其他对结点的操作 */
while (p->RTag == Thread && p->rchild != T)
{
p = p->rchild;
printf("%c", p->data);
}
p = p->rchild; /* p进至其右子树根 */
}
return OK;
}