面试题: 二叉搜索树转换成有序双向链表

来源:互联网 发布:windows server怎么看 编辑:程序博客网 时间:2024/06/05 09:32

因为二叉搜索树的中序遍历是有序的,所以以中序遍历实现,要是双向链表,我们可以将结点的左孩子转换成前驱指针,结点的右孩子转换成后继指针。(可以用一个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);         }  };  
阅读全文
0 0
原创粉丝点击