要求不能创建新节点,只调整指针
递归解法:
(1) 如果二叉查找树为空,不需要转换,对应双向链表的第一个节点是NULL,最后一个节点是NULL
(2) 如果二叉查找树不为空:
如果左子树为空,对应双向有序链表的第一个节点是根节点,左边不需要其他操作
如果左子树不为空,转换左子树,二叉查找树对应双向有序链表的的第一个节点就是左子树转换后双向有序链表的第一个节点,同时将根节点和左子树转换后的双向有序链表的最后一个节点连接
如果右子树为空,对应双向有序链表的最后一个节点是根节点,右边不需要其他操作
如果右子树不为空,对应双向有序链表的最后一个节点就是右子树转换后双向有序链表的最后一个节点,同时将根节点和右子树转换后的双向有序链表的第一个节点连接
参考代码如下:
struct BinaryTreeNode
{
int m_nValue;
struct BinaryTreeNode m_pLeft;
struct BinaryTreeNode m_pRight;
};
/********************************************
参数:
pRoot:二叉查找树根节点指针
pFirstNode: 转换后双向有序链表的第一个节点指针
pLastNode: 转换后双向有序链表的最后一个节点指针
*********************************************/
void Convert(BinaryTreeNode *pRoot,BinaryTreeNode *pFirstNode,BinaryTreeNode *pLastNode)
{
BinaryTreeNode *pFirstLeft,*pLastLeft,*pFirstRight,*pLastRight;
if(pRoot==NULL)
{
pFirstNode=NULL;
pLastNode==NULL;
return;
}
if(pRoot->m_pLeft==NULL)
{
//如果左子树为空,对应双向有序链表的第一个节点是根节点
pFirstNode=pRoot;
}
else
{
Convert(pRoot->m_pLeft,pFirstLeft,pLastLeft);
//二叉查找树对应双向有序链表的第一个节点就是左子树转换后双向有序链表的第一个节点
pFirstNode=pFirstLeft;
// 将根节点和左子树转换后的双向有序链表的最后一个节点连接
pRoot->m_pLeft=pLastLeft;
pLastLeft->m_pRight=pRoot;
}
if(pRoot->m_pRight==NULL)
{
//对应双向有序链表的最后一个节点是根节点
pLastNode=pRoot;
}
else
{
Convert(pRoot->m_pRight,pFirstRight,pLastRight);
//对应双向有序链表的最后一个节点是右子树转换后双向有序链表的最后一个节点
pLastNode=pLastRight;
//将根节点和右子树转换后的双向有序链表的第一个节点连接
pRoot->m_pRight=pFirstRight;
pFirstRight->m_pLeft=pRoot;
}
return;
}