输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建新的结点,只能调整树中结点指针的指向。
在搜索二叉树中,左子结点的值总是小于父结点的值,右子结点的值总大于父结点的值,因此我们在转换成排序双向链表时,原先指向左子结点的指针调整为链表中前一个结点的指针,原先指向右子结点的指针调整为链表中指向后一个结点指针。
我们可以中序遍历树中每一个结点。当遍历到根节点时,应将它与其左子树中最大结点和其右子树中最小的结点相连。而此时,根节点的左子树已经是一个排序的链表了,并且链表最后一个结点是左子树中最大的,将其与根节点相连。遍历右子树时,将它与右子树中最小的结点相连。
void ConvertNode(TreeNode *pNode, TreeNode **pLastNode)
{
if (pNode == NULL)
return;
TreeNode *pCur = pNode;
if (pCur->left != NULL)
{
ConvertNode(pCur->left, pLastNode);//遍历左子树
}
//处理根节点
pCur->left = *pLastNode;
if (*pLastNode != NULL)
(*pLastNode)->right = pCur;
*pLastNode = pCur;
//遍历右子树
if (pCur->right != NULL)
{
ConvertNode(pCur->right, pLastNode);
}
}
TreeNode* Convert(TreeNode* pRootOfTree)
{
TreeNode *pLastNode = NULL;//指向双向链表的尾结点
ConvertNode(pRootOfTree, &pLastNode);//二叉排序树转换成排序双向链表
//取得双向链表的头指针
TreeNode *pHead = pLastNode;
while (pHead != NULL&&pHead->left != NULL)
{
pHead = pHead->left;
}
return pHead;
}