您的位置:首页 > 其它

把二元查找树转变成排序的双向链表

2012-08-27 16:20 405 查看
#include <iostream.h>

struct BSTreeNode
{
int m_nValue;
struct BSTreeNode *m_pLeft;
struct BSTreeNode *m_pRight;
};

void addBSTreeNode(BSTreeNode *&pCurrent,int value); //建立二叉排序树
void inOrderBSTree(BSTreeNode *pBSTree); //中序遍历
void convertToDoubleList(BSTreeNode *pCurrent);//转换成双链表

BSTreeNode *pHead=NULL;//指向双链表的头结点
BSTreeNode *pIndex=NULL;//指向前一个结点

int main()
{
BSTreeNode *pRoot=NULL;
addBSTreeNode(pRoot,10);
addBSTreeNode(pRoot,6);
addBSTreeNode(pRoot,14);
addBSTreeNode(pRoot,4);
addBSTreeNode(pRoot,8);
addBSTreeNode(pRoot,12);
addBSTreeNode(pRoot,16);

inOrderBSTree(pRoot);
return 0;
}

void addBSTreeNode(BSTreeNode *&pCurrent,int value)
{
if(pCurrent==NULL)
{
BSTreeNode *pBSTree=new BSTreeNode;
pBSTree->m_nValue=value;
pBSTree->m_pLeft=NULL;
pBSTree->m_pRight=NULL;
pCurrent=pBSTree;
}
else if (pCurrent->m_nValue<value)
{
addBSTreeNode(pCurrent->m_pRight,value);
}
else if (pCurrent->m_nValue>value)
{
addBSTreeNode(pCurrent->m_pLeft,value);
}
else
{
cout<<"node repeated"<<endl;
}
}

void inOrderBSTree(BSTreeNode *pBSTree)
{
if (NULL==pBSTree)
{
return;
}

if (NULL!=pBSTree->m_pLeft)
{
inOrderBSTree(pBSTree->m_pLeft);
}

convertToDoubleList(pBSTree);

if (NULL!=pBSTree->m_pRight)
{
inOrderBSTree(pBSTree->m_pRight);
}
}

void convertToDoubleList(BSTreeNode *pCurrent)
{
pCurrent->m_pLeft=pIndex;

if (NULL==pIndex)
{
pHead=pIndex;
}

else
{
pIndex->m_pRight=pCurrent;
}

pIndex=pCurrent;

cout<<pCurrent->m_nValue<<" ";
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: