先用一个具体实例来描述一下这个问题
二叉搜索树的中序遍历,当遍历到根节点时,它的左子树已经成为一个排序链表了,所以将根节点与链表中的最后一个节点连接起来。此时根节点为链表的最后一个节点,再将根节点与右子树中最小的值连接起来。 所以转换时需要知道链表的最后一个节点
具体代码实现:
//二叉搜索树转换为双向链表
BinarySearchTreeNode<V>* TreeToList()
{
BinarySearchTreeNode<V>* pTailNode = NULL;//指向双向链表的尾结点
_TreeToList(_pRoot, &pTailNode);
//返回头结点
BinarySearchTreeNode<V>* pHead = pTailNode;
while (pHead && pHead->_Left)
pHead = pHead->_Left;
while (pHead)//打印双向链表
{
cout << pHead->_val <<" ";
pHead = pHead->_Right;
}
cout << endl;
return pHead;
}
//递归转换
void _TreeToList(BinarySearchTreeNode<V>* pRoot, BinarySearchTreeNode<V>** pTailNode)
{
if (pRoot == NULL)
return;
BinarySearchTreeNode<V>* pCur = pRoot;
//中序遍历二叉树
if (pCur->_Left != NULL)//遍历左子树
_TreeToList(pCur->_Left, pTailNode);
pCur->_Left = *pTailNode;//当前结点的左指针链表的尾
if (*pTailNode != NULL)
(*pTailNode)->_Right = pCur;
*pTailNode = pCur;//此时链表最后一个节点为当前节点
if (pCur->_Right != NULL)//遍历右子树
_TreeToList(pCur->_Right, pTailNode);
}