按照中序遍历的顺序,当遍历转换到根结点(10)时,它的左子树已经转换成一个排序的链表了,并且处在链表中的最后一个结点是当前值最大的结点(8)。我们把值为8的结点和根结点(10)接起来,此时链表中的最后一个节点就是10了。接着去遍历转换右子树,并把根结点和右子树中最小的结点(12)链接起来。对于怎么转换左右子树,可以用递归实现。
这里利用了二叉搜索树包括它的所有子树: 最小值是最左结点,最大值是最右结点的特点
#include <iostream>
#include "BinaryTree.h"
using namespace std;
void ConvertNode(BinaryTreeNode* pRoot, BinaryTreeNode** pLastNodeInList);
BinaryTreeNode* Convert(BinaryTreeNode* pRoot)
{
BinaryTreeNode* pLastNodeInList = NULL;
ConvertNode(pRoot, &pLastNodeInList);
BinaryTreeNode* pHeadOfList = pLastNodeInList;
while(pHeadOfList != NULL && pHeadOfList->m_pLeft != NULL)
pHeadOfList = pHeadOfList->m_pLeft;
return pHeadOfList;
}
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);
}