二叉树结构
typedef int DataType;
typedef enum PtrTag
{
THEARD, // 线索化
LINK, // 链接左右孩纸
}PtrTag;
typedef struct BinaryTreeNodeThd
{
DataType _data;
struct BinaryTreeNodeThd* _left;
struct BinaryTreeNodeThd* _right;
//struct BinaryTreeNodeThd* _parent;
enum PtrTag _leftTag;
enum PtrTag _rightTag;
}BTNodeThd;
前序线索化
//前序线索化
void BTreeThdPrevOderThreading(BTNodeThd* cur, BTNodeThd** pprev)
{
if (cur == NULL)
return;
if (cur->_left == NULL)
{
//左孩子为空,线索化
cur->_left = *pprev;
cur->_leftTag = THEARD;
}
if (*pprev && (*pprev)->_right == NULL)
{
//右线索化
(*pprev)->_right = cur;
(*pprev)->_rightTag = THEARD;
}
*pprev = cur; //让prev=cur 记录右为NULL的结点,方便线索化
if (cur->_leftTag == LINK)
BTreeThdPrevOderThreading(cur->_left, pprev);
if (cur->_rightTag == LINK)
BTreeThdPrevOderThreading(cur->_right, pprev);
}
中序线索化
//中序线索化
void BTreeThdInOrderBTreading(BTNodeThd* cur, BTNodeThd** pprev)
{
if (cur == NULL)
return;
//递归找到左树
BTreeThdInOrderBTreading(cur->_left, pprev);
//线索化
if (cur->_left == NULL)
{
cur->_left = *pprev;
cur->_leftTag = THEARD;
}
//线索化右子树
if (*pprev && (*pprev)->_right == NULL)
{
(*pprev)->_right = cur;
(*pprev)->_rightTag = THEARD;
}
*pprev = cur;
BTreeThdInOrderBTreading(cur->_right, pprev);
}