输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
-------------------------------------------------------------------------------------------------
#include <iostream.h>
struct BSTreeNode
{
int m_nValue;
BSTreeNode *m_pLeft;
BSTreeNode *m_pRight;
};
typedef BSTreeNode DoubleList;
DoubleList * pHead;
DoubleList * pListIndex;
void convertToDoubleList(BSTreeNode * pCurrent);
//创建二元查找树
void addBSTreeNode(BSTreeNode* &pCurrent, int value)
{
if(NULL == pCurrent)
{
BSTreeNode * pBSTree = new BSTreeNode();
pBSTree->m_nValue = value;
pBSTree->m_pLeft = NULL;
pBSTree->m_pRight = NULL;
pCurrent = pBSTree;
}
else
{
if(value < pCurrent->m_nValue)
{
addBSTreeNode(pCurrent->m_pLeft, value);
}
else if(value > pCurrent->m_nValue)
{
addBSTreeNode(pCurrent->m_pRight, value);
}
else
{
cout<<"输入重复元素"<<endl;
}
}
}
//遍历二元查找树-中序
void ergodicBSTree(BSTreeNode * pCurrent)
{
if(NULL == pCurrent)
{
return ;
}
if(NULL != pCurrent->m_pLeft)
{
ergodicBSTree(pCurrent->m_pLeft);
}
convertToDoubleList(pCurrent);
if(NULL != pCurrent->m_pRight)
{
ergodicBSTree(pCurrent->m_pRight);
}
}
//二叉树转换成list
void convertToDoubleList(BSTreeNode * pCurrent)
{
pCurrent->m_pLeft = pListIndex;
if(NULL != pListIndex)
{
pListIndex->m_pRight = pCurrent;
}
else
{
pHead = pCurrent;
}
pListIndex = pCurrent;
cout<<pCurrent->m_nValue<<endl;
}
void main()
{
BSTreeNode * pRoot = NULL;
pListIndex = NULL;
pHead = NULL;
addBSTreeNode(pRoot, 10);
addBSTreeNode(pRoot, 4);
addBSTreeNode(pRoot, 6);
addBSTreeNode(pRoot, 8);
addBSTreeNode(pRoot, 12);
addBSTreeNode(pRoot, 14);
addBSTreeNode(pRoot, 15);
addBSTreeNode(pRoot, 16);
ergodicBSTree(pRoot);
}