#include<iostream>
using namespace std;
enum PointTag
{
LINK,
THREAD,
};
struct BinTreeThingNode
{
char _data;
BinTreeThingNode*_left;
BinTreeThingNode*_right;
PointTag _leftTag;
PointTag _rightTag;
BinTreeThingNode(const char &data)
:_data(data)
, _left(NULL)
, _right(NULL)
, _leftTag(LINK)
, _rightTag(LINK)
{}
};
class BinTreeThreading
{
public:
BinTreeThreading(const char *str)
{
_CreatBinTreeThreading(_root,str);//递归创建二叉树
}
void PrevThread()//前序线索化
{
BinTreeThingNode*prev = NULL;
_PrevOderThread(_root, prev);
}
void PrevSort()//前序线索化的遍历
{
BinTreeThingNode *cur = _root;
while (cur)
{
while (cur&&cur->_leftTag != THREAD)
{
cout << cur->_data << " ";
cur = cur->_left;
}
cout << cur->_data << " ";
cur = cur->_right;
}
}
protected:
//递归创建二叉树
void _CreatBinTreeThreading(BinTreeThingNode*&root, const char *&str)
{
if (*str != '#'&&*str != '\0')
{
root = new BinTreeThingNode(*str);
_CreatBinTreeThreading(root->_left, ++str);
if (*str != '\0')
{
_CreatBinTreeThreading(root->_right, ++str);
}
}
}
//前序线索化的实现
void _PrevOderThread(BinTreeThingNode*&cur, BinTreeThingNode*&prev)
{
if (cur)
{
if (cur->_left == NULL)
{
cur->_leftTag = THREAD;
cur->_left = prev;
}
if (prev&&prev->_right == NULL)
{
prev->_rightTag = THREAD;
prev->_right = cur;
}
prev = cur;
if (cur->_leftTag == LINK)//防止陷入递归
{
_PrevOderThread(cur->_left, prev);
}
if (cur->_rightTag == LINK)//防止陷入递归
{
_PrevOderThread(cur->_right, prev);
}
}
}
private:
BinTreeThingNode*_root;
};
【C++】前序线索化二叉树及其遍历
最新推荐文章于 2022-05-03 10:15:25 发布