题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点只能调整树中结点指针的指向。
思路:对于二叉搜索树,根结点的左子树都比它小,右子树都比它大,如果按照中序遍历那么结点就是排序的,问题的关键是如何修改指针指向。假设左右子树已经排序,那么只要将左子树的尾结点连接上根结点,根结点连接上右子树就可以了。关于怎么连接左右子树,还是有一点技巧的。我们每次连接完成之后都更新尾结点,因为每次连接都要用到尾结点,把它作为转换函数的一个参数传进去。左子树转换后的尾结点连接根结点,然后根结点作为新的尾结点去连接右子树。左右子树的转换等同于于根结点的转换,因此这是一个递归的过程。
BinaryTreeNode* Convert(BinaryTreeNode* pRoot)
{
BinaryTreeNode* pLastNodeInList = NULL;
ConvertNode(pRoot, &pLastNodeInList);
BinaryTreeNode* pHeadOfList = pLastNodeInList;
while(pHeadOfList != NULL && pHeadOfList->m_pLeft != NULL)
pHeadOfList = pHeadOfList->m_pLeft;
return pHeadOfList;
}
ConvertNode(BinaryTreeNode* pNode, BinaryTreeNode** pLastNodeInList)
{
if(pNode == NULL)
return;
if(pNode->m_pLeft != NULL)
ConvertNode(pNode->m_pLeft, pLastNodeInList);
BinaryTreeNode* pCurrent = pNode;
if(*pLastNodeInList != NULL)
pLastNodeInList->m_pRight = pCurrent;
pCurrent->m_pLeft = *pLastNodeInList;
*pLastNodeInList = pCurrent;
if(pNode->m_pRight != NULL)
ConvertNode(pNode->m_pRight, pLastNodeInList);
}