您的位置:首页 > 其它

将二叉搜索树转换成一个排序的双向链表

2017-07-31 13:49 507 查看
先用一个具体实例来描述一下这个问题



二叉搜索树的中序遍历,当遍历到根节点时,它的左子树已经成为一个排序链表了,所以将根节点与链表中的最后一个节点连接起来。此时根节点为链表的最后一个节点,再将根节点与右子树中最小的值连接起来。 所以转换时需要知道链表的最后一个节点

具体代码实现:

//二叉搜索树转换为双向链表
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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐