在前边学习了搜索二叉树之后,我们知道,搜索二叉树的中序遍历结果是一个升序序列,如果我们可以利用二叉树的中序线索化的方法将搜索二叉树进行转换。
每一次转换时,我们需要记住当前结点的上一个结点prev,让prev的right指向当前结点cur,让cur的left指向prev,然后改变prev即可。线索化完成之后,我们需要找原来搜索二叉树的最左结点,即就是转换后的双向链表的头~
下边给出实现代码:
template<typename T>
struct Node
{
T _data;
Node<T>* _left;
Node<T>* _right;
};
template<typename T>
class TreeToList
{
typedef Node<T> Node;
public:
TreeToList()
{}
Node* ToList(Node* root)
{
Node* prev = NULL;
_ToList(root,prev); //转换成双向链表
while (head->_left) //寻找链表的头
head = head->_left;
return head;
}
protected:
void _ToList(Node* root,Node* prev)
{
if(root == NULL)
return;
_ToList(root->_left,prev);
root->_left = prev;
if(prev)
prev->_right = root;
prev = root;
_ToList(root->_right,prev);
}
};