根据搜索二叉树的性质:中序遍历是有序的,因此中序遍历搜索二叉树,将left相当于prev指向前一个小的数,right相当于next指向后一个较大的数。
递归实现
Node* TurnToList_R() //搜索树转换为有序的双向链表
{
cout << "递归" << endl;
Node *Head = NULL; //头指针
Node *Tail = NULL; //尾指针
_TurnToList(_root, Tail);
//找头结点
Head = _root;
while (Head->_left)
{
Head = Head->_left;
}
return Head;
}
void _TurnToList(Node *&root, Node *&Tail)
{
if (root == NULL)
return;
Node *cur = root;
if (cur->_left)
_TurnToList(cur->_left, Tail);
cur->_left = Tail; //使下一个节点和链表尾连接上
if (Tail != NULL)
Tail->_right = cur;
Tail = cur; //更新尾指针
if (cur->_right)
_TurnToList(cur->_right, Tail);
}
非递归
Node* TurnToList()
{
cout << "非递归" << endl;
stack<Node*> s;
Node *cur = _root; //遍历搜索树
Node *node = NULL; //当前节点
Node *tail = NULL;
Node *head = NULL;
while (cur || !s.empty())
{
while (cur)
{
s.push(cur);
cur = cur->_left;
}
if (!s.empty())
{
node = s.top();
s.pop();
if (head == NULL) //设置头结点
{
head = node;
}
node->_left = tail;
if (tail)
tail->_right = node;
tail = node;
cur = node->_right;
}
}
tail->_right = NULL;
return head;