先简要说下什么线索化
二叉树是一种非线性结构,遍历二叉树几乎都是通过递归或者用栈辅助实现非递归的遍历。用二叉树作为存储结构时,取到一个节点,只能获取节点的左孩子和右孩子,不能直接得到节点的任一遍历序列的前驱或者后继。由于有n个结点的二叉链表中必定存在n+1个空指针域,因此充分利用这些空指针域来存放结点的前驱和后继信息。
本篇主要介绍二叉树的前序和中序线索化以及遍历,下篇介绍后序线索化以及遍历
线索化二叉树结点:
enum Info //存放标志
{
LINK,
THREAD
};
template<class T>
struct BinaryTreeNodeThd
{
BinaryTreeNodeThd(const T& data)
: _data(data)
, _pLeft(NULL)
, _pRight(NULL)
, _pParent(NULL)
, _LeftThread(LINK)
, _RightThread(LINK)
{}
T _data;
BinaryTreeNodeThd<T>* _pLeft;
BinaryTreeNodeThd<T>* _pRight;
BinaryTreeNodeThd<T>* _pParent;
Info _LeftThread;
Info _RightThread;
};
结点默认的左右线索标志符为LINK, 当需要线索化时改为THREAD,
首先创建二叉树:采用前序的方式创建
BinaryTreeThd()
:_pRoot(NULL)
{
}
BinaryTreeThd(T