线索化二叉树:
当某个节点的左孩子为空时,将_pLeft指针指向他的前一个节点;
当某个节点的右孩子为空时,将_pRight指针指向它的后一个结点。
根据遍历方式不同,得到的前后节点也不同,线索化二叉树分为三种不同的情况:
先序遍历线索化二叉树
中序遍历线索化二叉树
后序遍历线索化二叉树
线索二叉树与普通二叉树有什么区别呢?线索化二叉树中空的指针域至多2个,至少1个;
普通二叉树中空的指针域是n+1个,n(节点数)。
所以能够有效地利用资源,并且在遍历时不用递归和栈结构也可以遍历。
为了区别两个节点的关系是双亲-孩子节点,还是前驱-后继节点,可以在每个节点创建时 ,增加两个成员变量,_leftThread和_rightThread,这两个变量只有两种状态,LINK(双亲-孩子)、THREAD(前驱=后继)。
#include <iostream>
#include <windows.h>
#include <string.h>
using namespace std;
enum PointIhfo
{
LINK,
THREAD
};
template <class T>
struct BinaryTreeNodeThd//定义二叉树的节点
{
BinaryTreeNodeThd(const T& value)
:_value(value)
,_pLeft(NULL)
,_pRight(NULL)
,_pParent(NULL)
, _leftThread(LINK)
, _rightTrhead(LINK)
{}
T _value;
BinaryTreeNodeThd<T>* _pLeft;
BinaryTreeNodeThd<T>* _pRight;
BinaryTreeNodeThd<T>* _pParent;
PointIhfo _leftThread;
PointIhfo _rightTrhead;
};
template<class T>
class BinaryTreeThd
{
typedef BinaryTreeNodeThd<T> Node;
public:
BinaryTreeThd()
:_pRoot(NULL)
{}
BinaryTreeThd(const T arr[], size_t size, const T& invalid)
{
size_t index=0;
_CreateBinaryTree(_pRoot, NULL, arr, size, index, invalid);
}
BinaryTreeThd(const BinaryTreeThd<T>& bt)
{
_pRoot = _CopyBinaryTree(bt._pRoot);
}
BinaryTreeThd<T>& operator=(const BinaryTreeThd<T>& bt)
{