头文件
#include"stdio.h"
#include"assert.h"
#include"malloc.h"
typedef char DataType;
typedef enum{ LINK, THREAD }PointFlag;
typedef struct BinTreeNode
{
struct BinTreeNode* _pLeft;
struct BinTreeNode* _pRight;
struct BinTreeNode* _pParent;
DataType _data;
PointFlag _leftThread;
PointFlag _rightThread;
}Node, *PNode;
void InitBinTree(PNode pRoot)
{
pRoot = 0;
}
PNode BuyNode(DataType data);
void _CreateBinTree(PNode* pRoot, DataType array[], int size, int* index, DataType invalid);
void CreateBinTree(PNode* pRoot, DataType array[], int size, DataType invalid);
void _PreOrderThd(PNode pRoot, PNode* prev);
void PreOrderThd(PNode pRoot);
void _InOrderThd(PNode pRoot, PNode* prev);
void InOrderThd(PNode pRoot);
void _PostOrderThd(PNode pRoot, PNode* prev);
void PostOrderThd(PNode pRoot);
void PreOrderD(PNode pRoot);
void InOrderD(PNode pRoot);
函数实现部分
#include"Treenode.h"
void CreateBinTree(PNode* pRoot, DataType* array, int size, DataType invalid)
{
int index = 0;
_CreateBinTree(&pRoot, array, size, &index, '#');
}
void _CreateBinTree(PNode* pRoot, DataType* array, int size, int* index, DataType invalid)
{
if (invalid != array[*index])
{
PNode pRoot = BuyNode(array[*index]);
_CreateBinTree(&(pRoot->_pLeft), array, size, ++(*index), '#');
_CreateBinTree(&pRoot->_pRight, array, size, ++(*index), '#');
}
}
PNode BuyNode(DataType data)
{
PNode pNewNode = (PNode)malloc(sizeof(Node));
assert(pNewNode);
pNewNode->_pLeft = NULL;
pNewNode->_pRight = NULL;
pNewNode->_pParent = NULL;
pNewNode->_data = data;
pNewNode->_leftThread = LINK;
pNewNode->_rightThread = LINK;
return pNewNode;
}
void _PreOrderThd(PNode pRoot)
{
PNode prev = NULL;
PNode pcur = pRoot;
if (pcur)
{
if (pcur->_pLeft==NULL )
{
pcur->_pLeft = prev;
pcur->_leftThread = THREAD;
}
if (prev&&prev->_pRight == NULL)
{
prev->_pRight=pcur;
prev->_rightThread = THREAD;
}
prev = pcur;
if (pcur->_leftThread == LINK)
{
_PreOrderThd(pcur->_pLeft);
}
if (pcur->_rightThread == LINK)
{
_PreOrderThd(pcur->_pRight);
}
}
}
void PreOrderThd(PNode pRoot)
{
PNode *prev = NULL;
_PreOrderThd(pRoot);
}
void _InOrderThd(PNode pRoot)
{
PNode prev = NULL;
PNode pcur = pRoot;
if (pRoot)
{
_InOrderThd(pRoot->_pLeft);
if (pcur->_pLeft == NULL)
{
pcur->_pLeft = prev;
pcur->_leftThread = THREAD;
}
if (prev&&prev->_pRight == NULL)
{
prev->_pRight = pcur;
prev->_rightThread = THREAD;
}
prev = pcur;
_InOrderThd(pcur->_pRight);
}
}
void InOrderThd(PNode pRoot)
{
PNode prev = NULL;
_InOrderThd(pRoot, &prev);
}
void _PostOrderThd(PNode pRoot)
{
PNode prev = NULL;
PNode pcur = pRoot;
if (pcur)
{
_PostOrderThd(pcur->_pLeft);
_PostOrderThd(pcur->_pRight);
if (pcur->_pLeft == NULL)
{
pcur->_leftThread = THREAD;
pcur->_pLeft = prev;
}
if (prev&&prev->_pRight == NULL)
{
prev->_pRight = pcur;
prev->_rightThread = THREAD;
}
prev = pcur;
}
}
void PostOrderThd(PNode pRoot)
{
PNode prev = NULL;
_PostOrderThd(pRoot, &prev);
}
void PreOrderD(PNode pRoot)
{
if (pRoot)
{
printf("%c ", pRoot->_data);
PreOrderD(pRoot->_pLeft);
PreOrderD(pRoot->_pRight);
}
}
void PreOrder(PNode pRoot)
{
PNode pcur = pRoot;
while (pcur)
{
while (pcur->_leftThread == LINK)
{
printf("%d ", pcur->_data);
pcur = pcur->_pLeft;
}
printf("%d", pcur->_data);
while(pcur->_rightThread == THREAD)
{
pcur = pcur->_pRight;
printf("%d ", pcur->_data);
}
if(pcur->_leftThread==LINK)
{
pcur = pcur->_pLeft;
}
else
{
pcur = pcur->_pRight;
}
}
}
void InOrderD(PNode pRoot)
{
PNode pCur = pRoot;
while (pCur)
{
while (LINK == pCur->_leftThread)
{
pCur = pCur->_pLeft;
}
printf("%c ", pCur->_data);
while (THREAD == pCur->_rightThread)
{
pCur = pCur->_pRight;
printf("%c ", pCur->_data);
}
pCur = pCur->_pRight;
}
}