您的位置:首页 > 编程语言 > C语言/C++

【C++】中序线索化二叉树及其遍历

2015-11-22 13:40 615 查看
二叉树是一种非线性结构,遍历二叉树几乎都是通过递归或者用栈辅助实现非递归的遍历。用二叉树作为存储结构时,取到一个节点,只能获取节点的左孩子和右孩子,不能直接得到节点的任一遍历序列的前驱或者后继。

为了保存这种在遍历中需要的信息,我们利用二叉树中指向左右子树的空指针来存放节点的前驱和后继信息。

[align=left]enumPointerTag{THREAD,LINK};[/align]

template
<class
T>

struct
BinaryTreeNode_Thd
[align=left]{[/align]

T _data
; // 数据

BinaryTreeNode_Thd<T>*_left; //
左孩子

BinaryTreeNode_Thd<T>*_right; //
右孩子

PointerTag _leftTag; // 左孩子线索标志

PointerTag _rightTag; // 右孩子线索标志
[align=left]};[/align]





<pre name="code" class="cpp"><pre name="code" class="cpp">#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 InOderThread()//中序线索化
{
BinTreeThingNode*prev = NULL;//prev是访问的上一节点
_InOderThread(_root, prev);//中序线索化的实现
}
void InOderSort()//通过中序线索化中序遍历二叉树
{
BinTreeThingNode*cur = _root;
while (cur)
{
while (cur&&cur->_leftTag != THREAD)
{
cur = cur->_left;
}
cout << cur->_data << " ";
while (cur&&cur->_rightTag == THREAD)
{
cur = cur->_right;
cout << cur->_data << " ";
}
if (cur)
{
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 _InOderThread(BinTreeThingNode*&cur, BinTreeThingNode*&prev)
{
if (cur)
{
_InOderThread(cur->_left, prev);
//当前节点cur的前驱
if (cur->_left == NULL)
{
cur->_leftTag = THREAD;
cur->_left = prev;//当前节点的前驱是上一节点
}
//上一节点prev的后继
if (prev&&prev->_right == NULL)
{
prev->_rightTag = THREAD;
prev->_right = cur;//上一节点的后继是当前节点
}
prev = cur;//更新上一访问的节点
_InOderThread(cur->_right, prev);
}
}

private:
BinTreeThingNode*_root;
};


void Test()
{
BinTreeThreading bt("123##4##56");
bt.InOderThread();
bt.InOderSort();
}
int main()
{
Test();
system("pause");
return 0;
}




                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: