题目
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。如下图所示:
二叉树结点定义如下:
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};
代码
书上是用递归实现的,我写了一个非递归的。
BinaryTreeNode* MyConvert(BinaryTreeNode* pRoot)
{
if (pRoot == NULL)
return NULL;
stack<BinaryTreeNode*> s;
BinaryTreeNode* pPre = NULL;
BinaryTreeNode* pNode = pRoot;
BinaryTreeNode* pStart = NULL;
BinaryTreeNode* pTmp = NULL;
while (pNode)
{
s.push(pNode);
pNode = pNode->m_pLeft;
}
while (!s.empty())
{
pNode = s.top();
s.pop();
pTmp = pNode;
pNode = pNode->m_pRight;
while (pNode)
{
s.push(pNode);
pNode = pNode->m_pLeft;
}
if (pStart == NULL)
pStart = pTmp;
//printf("%d ", pTmp->m_nValue);
pTmp->m_pLeft = pPre;
if (!s.empty())
pTmp->m_pRight = s.top();
else
pTmp->m_pRight = NULL;
pPre = pTmp;
}
return pStart;
}