二叉树线索化以及线索化前序、中序、后序遍历
前面已经对二叉树的创建与建立有了一定了解,那二叉树的线索化又是什么呢?
二叉树虽然是非线性结构,但二叉树的遍历却为二叉树的节点导出了一个线性序列。
用二叉树作为存储结构时,取到一个节点,只能获取节点的左孩子和右孩子,不能直接得到节点的任一遍历序列的前驱或者后继。
为了保存这种在遍历中需要的信息,我们利用二叉树中指向左右子树的空指针来存放节点的前驱和后继信息
利用二叉树中的空指针域来存放在某种遍历次序下的前驱和后继,这种指针叫“线索”。这种加上了线索的二叉树称为线索二叉树。
根据线索的性质的不同,线索二叉树分为:前序线索二叉树 , 中序线索二叉树 , 后序线索二叉树
节点结构如下:
enum PointerTag{ LINK, THREAD };
template<class T>
struct BinTreeNodeTread
{
BinTreeNodeTread(const T& data)
: _pLeft(NULL)
, _pRight(NULL)
, _leftThread(LINK)
, _rightThread(LINK)
, _data(data)
{}
BinTreeNodeTread* _pLeft;
BinTreeNodeTread* _pRight;
PointerTag _leftThread; // 左线索
PointerTag _rightThread; // 右线索
T _data;
};
_leftThread标记是否有左子树,值为LINK表示有左孩子,值为THREAD表示没有左孩子