您的位置:首页 > 其它

将搜索二叉树转换成有序的双向链表

2016-07-21 19:24 253 查看
根据搜索二叉树的性质:中序遍历是有序的,因此中序遍历搜索二叉树,将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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息