您的位置:首页 > 理论基础 > 数据结构算法

数据结构之二叉树(前序 中序 后续线索话非递归方式)

2016-06-03 10:18 579 查看
节点:
enum LinkType
{
THREAD,
LINK
};

template<class T>
struct ThredBinaryNode
{
ThredBinaryNode *_left;
ThredBinaryNode *_right;
LinkType _left_tag;
LinkType _right_tag;

T _data;
ThredBinaryNode( T data ) :_data(data), _left( NULL), _right(NULL ), _left_tag(LINK), _right_tag(LINK)
{};
};
线索化二叉树为:
template<class T>
class BinaryTreeThred
{
typedef ThredBinaryNode <T> Node;
public:
BinaryTreeThred( const T * a, size_t size, const T & valiue)
{
size_t index = 0;
_root = _CreatTree( a, size , index, valiue);
}
private:

Node *_root;

};

构造函数:
Node*_CreatTree(const T* a, size_t size, size_t &index, const T &valiue)
{
Node *root = NULL ;
if (index < size&& a[index ] != valiue)
{
root = new Node (a[index]);
root->_left = _CreatTree(a, size , ++index, valiue);
root->_right = _CreatTree(a, size , ++index, valiue);
}
return root;
}

中序线索化递归:

void _InThred(Node *cur, Node* & prev)//递归线索化
{
if (cur != NULL)
{

_InThred( cur->_left, prev );
if (cur ->_left == NULL)
{
cur->_left_tag = THREAD ;
cur->_left = prev ;
}
if (prev != NULL&& prev->_right==NULL )
{
prev->_right_tag = THREAD ;
prev->_right = cur ;
}
prev = cur ;
_InThred( cur->_right, prev );
}

};

中序线索非递归:
void InThred_Nor()//非递归
{
stack<Node *> s;
Node *prev = NULL ;
Node *cur = _root;
while (cur||!s.empty())
{
while (cur)
{
s.push(cur);
cur = cur->_left;
};
Node *tmp = s.top();
s.pop();
if (tmp->_left == NULL )
{
tmp->_left = prev;
tmp->_left_tag = THREAD;
}
prev = tmp;
if (prev->_right == NULL &&!s.empty())
{
tmp->_right = s.top();
tmp->_right_tag = THREAD;
}
else
{
cur = tmp->_right;
}
}
}

前序线化非递归:
void BinaryTreeThred <T>::PreThread() //前序线索化非递归
{
Node *pre = NULL ;
Node*cur = _root;
stack<Node *> s;
s.push(cur);
while (cur||!s.empty())
{
Node *tmp = NULL ;
if (!s.empty())
{
tmp = s.top();
}
else
{
return;
}

s.pop();
if (tmp->_right)
{
s.push(tmp->_right);
}

if (tmp->_left)
{
s.push(tmp->_left);
}
else//tmp->left==null
{
tmp->_left_tag = THREAD;
tmp->_left=pre;
}
if (pre != NULL &&pre->_right == NULL)
{
pre->_right_tag = THREAD;
pre->_right = tmp;
}
pre = tmp;
}
}

后序列线索话非递归:

void BinaryTreeThred <T>::PostThread() //后续
{
Node *cur = _root;
stack<Node *> s;
Node *prev = NULL ;
while (cur || !s.empty())
{
while (cur)
{
s.push(cur);
cur = cur->_left;//3
}
Node *tmp = s.top();
if (tmp->_right == NULL || tmp->_right == prev)
{
if (tmp->_left == NULL )
{
tmp->_left_tag = THREAD;
tmp->_left = prev;
}
if (prev != NULL &&prev->_right == NULL)
{
prev->_right_tag = THREAD;
prev->_right = tmp;
}
s.pop();
prev = tmp;
}
else
{
cur = tmp->_right;
}
}

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