二叉树的线索化

二叉树的线索化

头文件

#include"stdio.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);

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);//中序

void postOrderD(PNode pRoot);//后序

 

函数部分

#include"Treenode.h"

void InitBinTree(PNode pRoot)

{

pRoot = 0;

}

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]);

        PNode pRoot-> _pLeft = _CreateBinTree(&pRoot, array, size, ++(*index), '#');

PNode pRoot->_pRight = _CreateBinTree(&pRoot, 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 InOrderThd(PNode pRoot)//递归中序线索化

{

PNode prev = NULL;

_InOrderThd(pRoot, &prev);

}

void _PreOrderThd(PNode pRoot, PNode* prev)//非递归前序线索化

{

PNode prev = NULL;

if (pRoot)

 

{

if (NULL == pRoot->_pLeft)//线索化左子树

{

pRoot->_pLeft = prev;//标记

pRoot->_leftThread = THREAD;//已经被线索化

}

 

if (*prev&& NULL == (*prev)->_pRight)//线索化右子树

{

(*prev)->_pRight = prev;

(*prev)->_rightThread = THREAD;

}

PNode *prev = pRoot;

 

if (pRoot->_leftThread == LINK)//可能有左子树

{

_PreOrderThd(pRoot->_pLeft, &prev);//对其左子树进行线索化

}

if (pRoot->_rightThread == LINK)//可能有右子树

{

_PreOrderThd(pRoot->_pRight, &prev);

 

}

}

}

void PreOrderThd(PNode pRoot)//递归前序线索化

{

PNode prev = NULL;

_PreOrderThd(pRoot, &prev);

}

void _InOrderThd(PNode pRoot, PNode* prev) // 非递归中序线索化

{

if (pRoot)

{

 

_InOrderThd(pRoot, &prev);//找到最左端的结点D

 

if (pRoot->_pLeft == NULL)

{

pRoot->_pLeft = prev;

pRoot->_leftThread = THREAD;

}

PNode *prev = pRoot;

 

if (pRoot->_pRight == NULL)

{

pRoot->_pRight = *prev;//D的后继指向B

pRoot->_leftThread = THREAD;

}

}

}

void InOrderThd(PNode pRoot)//递归中序线索化

{

PNode prev = NULL;

_InOrderThd(pRoot, &prev);

}

 

void _PostOrderThd(PNode pRoot, PNode* prev)//非递归后序线索化

{

PNode prev = NULL;

if (pRoot)//遍历左子树,找到最左端的点D

 

{

_PostOrderThd(pRoot->_pLeft, &prev);

 

if (NULL == pRoot->_pLeft)

{

pRoot->_pLeft = *prev;

pRoot->_leftThread = THREAD;

}

*prev = pRoot;

if (pRoot->_pRight == NULL)

{

pRoot->_pRight = *prev;

pRoot->_rightThread = THREAD;

}

}

    

}

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)//有左子树

{

prinf("d%", pcur->_data);//遍历当前节点

pcur = pcur->_pLeft;

 

}//遍历A与B

printf("d%", pcur->_data);//遍历没有左子树的结点

while (pcur->_rightThread == THREAD)//没有右子树

{

pcur = pcur->_pRight;

//后继

printf("d%", pcur->_data);

 

}

if (pcur->_leftThread == LINK)//有左子树

 

pcur = pcur->_pLeft;//pcur成为e

else

pcur = pcur->_pRight;

}

}

void InOrderD(PNode pRoot)//递归中序

{

if (pRoot)

{

InOrderD(pRoot->_pLeft);

printf("%c ", pRoot->_data);

InOrderD(pRoot->_pRight);

}

void InOrderD(PNode pRoot)//非递归中序,中左右

{

PNode pcur = pRoot;

while (pcur)

{

while (pcur->_leftThread == LINK)//有左子树

{

 

pcur = pcur->_pLeft;

 

}

printf("d%", pcur->_data);//遍历当前节点

while (pcur->_rightThread == THREAD)//没有右子树

{

pcur = pcur->_pRight;

//后继

printf("d%", pcur->_data);

 

}

pcur = pcur->_pRight;

}

}

 

void postOrderD(PNode pRoot)//后序,左右中

{

PNode pcur = pRoot;

PNode prev = NULL;

while (pcur)

{

while (pcur->_leftThread == LINK)//有左子树

{

 

pcur = pcur->_pLeft;

 

}

while (pcur->_rightThread == THREAD)//没有右子树

{

printf("d%", pcur->_data);

prev = pcur;

pcur = pcur->_pRight;

 

}

if (pcur == pRoot&&NULL == pRoot->_pRight || prev == pRoot->_pRight)

{

printf("d%", pcur->_data);

return;

}

while (pcur->_pRight == LINK&&pcur)

{

printf("d%", pcur->_data);

prev = pcur;

 

}

pcur = pcur->_pParent;

}

}

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值