题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
二叉树结点的定义如下:
struct BinaryTreeNode{
int m_nValue;
BinaryTreeNode *m_pLeft;
BinaryTreeNode *m_pRight;
};
解法如下:
//返回双向链表的头结点
BinaryTreeNode *Convert(BinaryTreeNode *pRoot)
{
//指向已经装换好的链表的最后一个结点
BinaryTreeNode *pLast=NULL;
//转换排序二叉树为双向链表
ConvertNode(pRoot,&pLast);
//返回头结点
BinaryTreeNode *pHeadOfList=pLast;
while(pHeadOfList!=NULL&&pHeadOfList->m_pLeft!=NULL)
{
pHeadOfList=pHeadOfList->m_pLeft;
}
return pHeadOfList;
}
//采用中序遍历的方式将二叉树转化为双向链表, *pLastNodeInList指向双向链表的最后一个节点
void ConvertNode(BinaryTreeNode *pNode, BinaryTreeNode **pLastNodeInList)
{
if (pNode==NULL)
return;
BinaryTreeNode *pCurrent=pNode;
//先转化左子树
if (pCurrent->m_pLeft!=NULL)
ConvertNode(pCurrent->m_pLeft,pLastNodeInList);
//将双向链表的最后一个节点与根节点连接在一起
pCurrent->m_pLeft=*pLastNodeInList;
if(*pLastNodeInList!=NULL)
(*pLastNodeInList)->m_pRight=pCurrent;
*pLastNodeInList=pCurrent;
//转换右子树
if (pCurrent->m_pRight!=NULL)
ConvertNode(pCurrent->m_pRight,pLastNodeInList);
}