二叉樹中序線索化算法
//
// 二叉樹線索化的頭文件:BinaryThreadTree.h
#ifndef B_T_T_H
#define B_T_T_H
#include <stdio.h>
//
// 返回OK表示正常返回
#define OK 1
//
// 返回ERROR,表示異常返回
#define ERROR 0
//
// 返回OVERFLOW,表示內存溢出
#define OVERFLOW -1
//
// 線索結構體
typedef enum
{
Link = 0, // 指針
Thread = 1 // 線索
}PointerTag;
//
// 樹結點的數據的類型
typedef char ElemType;
//
// 返回值類型
typedef int Status;
//
// 線索二叉樹結構體
typedef struct tagBinaryThreadTree
{
ElemType data;
struct tagBinaryThreadTree *lchild; // 左孩子指針
struct tagBinaryThreadTree *rchild; // 右孩子指針
PointerTag leftTag; // 左標誌
PointerTag rightTag; // 右標誌
}BinThrTree, *LinkBinThrTree;
//
// 按先序順序輸入數據,以建立線索二叉樹
// 輸入的#表示子樹為空
Status CreateBinaryThreadTree(LinkBinThrTree *pBinThrTree);
//
// 中序遍曆線索化二叉樹
Status InOrderTraverse(LinkBinThrTree pBinThrTree);
//
// 線索化
void InThreading(LinkBinThrTree p);
//
// 中序線索化二叉樹
Status InOrderThreading(LinkBinThrTree *threadTree, LinkBinThrTree tree);
#endif
//
// 線索二叉線的實現文件:BinaryThreadTree.c
#include <stdio.h>
#include <stdlib.h>
#include "BinaryThreadTree.h"
LinkBinThrTree pre = NULL; //定義pre為函數InThreading的外部變量,使其指向最後一個節點
//
// 按先序順序輸入數據,以建立線索二叉樹
// 輸入的#表示子樹為空
Status CreateBinaryThreadTree(BinThrTree **pBinThrTree)
{
char ch;
scanf ("%c", &ch);
if (ch == '#')
{
*pBinThrTree = NULL;
}
else
{
*pBinThrTree = (LinkBinThrTree)malloc(sizeof(BinThrTree));
if (!(*pBinThrTree))
{
exit(OVERFLOW);
}
(*pBinThrTree)->data = ch;
(*pBinThrTree)->leftTag = Link;
(*pBinThrTree)->rightTag = Link;
CreateBinaryThreadTree(&(*pBinThrTree)->lchild);
CreateBinaryThreadTree(&(*pBinThrTree)->rchild);
}
return OK;
}
//
// 中序遍曆線索化二叉樹
Status InOrderTraverse(LinkBinThrTree pBinThrTree)
{
LinkBinThrTree p = NULL;
p = pBinThrTree->lchild;
while (p != pBinThrTree)
{
while (p->leftTag == Link)
{
p = p->lchild; // 沿著根向左走到盡頭
}
printf("%c", p->data); // 輸出
// 沿著線索向右走到盡頭
while (p->rightTag == Thread && p->rchild != pBinThrTree)
{
p = p->rchild;
printf("%c", p->data); // 輸出
}
p = p->rchild;
}
return OK;
}
//
// 線索化
void InThreading(LinkBinThrTree p)
{
if (p)
{
InThreading(p->lchild);
if (!p->lchild)
{
p->leftTag = Thread;
p->lchild = pre;
}
if (!pre->rchild)
{
pre->rightTag = Thread;
pre->rchild = p;
}
pre = p;
InThreading(p->rchild);
}
}
//
// 中序線索化二叉樹
Status InOrderThreading(LinkBinThrTree *threadTree, LinkBinThrTree tree)
{
if (!((*threadTree) = (LinkBinThrTree)malloc(sizeof(BinThrTree))))
{
exit(OVERFLOW);
}
(*threadTree)->leftTag = Link;
(*threadTree)->rightTag = Thread;
(*threadTree)->rchild = (*threadTree);
if (!tree) // 若樹空,左指針回指
{
(*threadTree)->lchild = (*threadTree);
}
else
{
(*threadTree)->lchild = tree;
pre = (*threadTree);
InThreading(tree);
pre->rchild = tree;
pre->rightTag = Thread;
tree->rchild = pre;
}
return OK;
}
//
// 測試線索二叉樹的算法的使用
#include <stdio.h>
#include <stdlib.h>
#include "BinaryThreadTree.h"
int main()
{
BinThrTree *tree = NULL, *head = NULL;
freopen("test.txt", "r", stdin);
if (CreateBinaryThreadTree(&tree))
{
printf("二叉樹創建成功!\n");
}
if (InOrderThreading(&head, tree))
{
printf("\n中序線索化二叉樹完畢!\n");
}
printf("\n中序遍曆線索化二叉樹:\n");
InOrderTraverse(tree);
fclose(stdin);
putchar(10);
return 0;
}
最後更新:2017-04-03 18:51:56