题目:
输入一颗二叉搜索数,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
二叉树节点的定义如下:
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
}
实现代码:
void ConvertNode(BinaryTreeNode* pRoot, BinaryTreeNode*& pLastNodeInList)
{
if (nullptr == pRoot) return;
BinaryTreeNode* pCurNode = pRoot;
if (pCurNode->m_pLeft != nullptr) ConvertNode(pCurNode->m_pLeft, pLastNodeInList); // 处理左子树
pCurNode->m_pLeft = pLastNodeInList;
if (pLastNodeInList != nullptr) pLastNodeInList->m_pRight = pCurNode;
pLastNodeInList = pCurNode;
if (pCurNode->m_pRight != nullptr) ConvertNode(pCurNode->m_pRight, pLastNodeInList); // 处理右子树
}
BinaryTreeNode* Convert(BinaryTreeNode* pRoot)
{
if (nullptr == pRoot) return nullptr;
BinaryTreeNode* pLastNodeInList = nullptr; // 双线链表的尾节点
ConvertNode(pRoot, pLastNodeInList);
BinaryTreeNode* pHeadNodeInList = pLastNodeInList; // 双向链表的头节点
while (pHeadNodeInList->m_pLeft != nullptr) pHeadNodeInList = pHeadNodeInList->m_pLeft; // 回缩到链表头
return pHeadNodeInList;
}