36
二叉搜索树变成排序的双向链表,不能创建任何节点,只能调整树中节点指针的指向,输出最左节点
二叉搜索树特征,排序的,双向链表
左子树最右节点最大,右子树最左节点最小,与根链接起来
注意边界条件,但凡能回环的就算结束
可以由下往上先拆分,再合并,也可以由上往下先合并,再拆分
void ConvertNode(BinaryTreeNode* pNode)//diy
{
BinaryTreeNode* pLeft = pNode->m_pLeft;
BinaryTreeNode* pRight = pNode->m_pRight;
BinaryTreeNode* pTemp = nullptr;
if (pLeft!=nullptr && pLeft->m_pRight != pNode)//boundary condition
{
pTemp = pLeft;
while (pTemp->m_pRight != nullptr)
pTemp = pTemp->m_pRight;
pTemp->m_pRight = pNode;
pNode->m_pLeft = pTemp;
ConvertNode(pLeft);
}
if (pRight!=nullptr && pRight->m_pLeft!=pNode)//boundary condition
{
pTemp = pRight;
while (pTemp->m_pLeft != nullptr)
pTemp = pTemp->m_pLeft;
pTemp->m_pLeft = pNode;
pNode->m_pRight = pTemp;
ConvertNode(pRight);
}
}
BinaryTreeNode* Convert(BinaryTreeNode* pRootOfTree)//diy
{
if (pRootOfTree == nullptr) return nullptr;
BinaryTreeNode* pTemp = pRootOfTree;
while (pTemp->m_pLeft != nullptr)
pTemp = pTemp->m_pLeft;
ConvertNode(pRootOfTree);
return pTemp;
}