因为二叉搜索树的中序遍历是有序的,所以以中序遍历实现,要是双向链表,我们可以将结点的左孩子转换成前驱指针,结点的右孩子转换成后继指针。(可以用一个prev指针来记录前一个结点,然后把prev的right(后继)指向cur,把cur的left(前驱)指向prev,之后再更新prev的值。)
template<typename T>
class TreeToList
{
typedef Node<T> Node;
public:
TreeToList()
{}
Node*& Transfrom(Node* &head) //head是搜索树的根节点
{
Node* prev = NULL;
_Transfrom(head,prev); //转换成双向链表
while (head->_left) //寻找链表的头
head = head->_left;
return head;
}
protected:
//采用中序线索化的思想,将left变为前驱指针,right变为后继指针
void _Transfrom(Node* root,Node* &prev)
{
if (root == NULL)
return;
Node* cur = root;
_Transfrom(cur->_left ,prev);
if (prev)
{
prev->_right = cur;
}
cur->_left = prev;
prev = cur;
_Transfrom(cur->_right ,prev);
}
};