思路:
二叉搜索树本来就是已经排好序的,左比根小右比根大。
所以我们将左子树的最右的节点与根相连并且将根与右子树中最左边的结点相连接。
之后对子树进行递归操作。
void ConvertNode(BinaryTreeNode* pNode,BinaryTreeNode** pLastNodeInList)
{
if(pNode == NULL)
return ;
BinaryTreeNode* pCur = pNode;
//构建左子树双向链表
if(pCur -> left != NULL)
ConvertNode(pCur -> left,pLastNodeInList);
//根与左右相连接
pCur -> left = *pLastNodeInList;
if(*pLastNodeInList != NULL)
(*pLastNodeInList) -> right = pCur;
//构建右子树双向链表
*pLastNodeInList = pCur;
if(pCur -> right != NULL)
ConvertNode(pCur -> right,pLastNodeInList);
}
//pLastNodeInList指向链表的尾,最后将它返回头处。
BinaryTreeNode* Convert(BinaryTreeNode* pRoot)
{
BinaryTreeNode* pLastNodeInList = NULL;
ConvertNode(pRoot,&pLastNodeInList);
BinaryTreeNode* pHeadOfList = pLastNodeInList;
while(pHeadOfList != NULL && pHeadOfList -> left != NULL)
pHeadOfList = pHeadOfList -> left;
return pHeadOfList;
}