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

来源:互联网 发布:2016年cms系统排行榜 编辑:程序博客网 时间:2024/05/16 01:57

根据搜索二叉树的性质:中序遍历是有序的,因此中序遍历搜索二叉树,将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;
0 0