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

论坛 期权论坛 脚本     
匿名网站用户   2020-12-19 17:39   11   0

原帖地址:http://topic.csdn.net/u/20101023/20/5652ccd7-d510-4c10-9671-307a56006e6d.html

输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。

10
/ \
6 14
/ \ / \
4 8 12 16

转换成双向链表
4=6=8=10=12=14=16。

在原作者的基础了作了些许改进:

#include<stdio.h>
#include<iostream>


using namespace std;
struct BSTreeNode;


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_pLeft=NULL;
pBSTree->m_pRight=NULL;
pBSTree->m_nValue=value;
pCurrent=pBSTree;
}
else
{
if((pCurrent->m_nValue)>value)
addBSTreeNode(pCurrent->m_pLeft,value);
else if((pCurrent->m_nValue)<value)
addBSTreeNode(pCurrent->m_pRight,value);
else
cout<<"repeat add node"<<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);
}




void convertToDoubleList(BSTreeNode* pCurrent)
{
/* 原文的方法
pCurrent->m_pLeft=pListIndex;


if(NULL!=pListIndex)
{
pListIndex->m_pRight=pCurrent;
pCurrent->m_pLeft=pListIndex;
}
else
pHead=pCurrent;
pListIndex=pCurrent;
cout<<pCurrent->m_nValue<<endl;*/


/*我的方法*/
if(pHead==NULL)//如果当前双向链表为空,当前节点为第一个节点
{
pHead=pCurrent;
pListIndex=pCurrent;
}
else
{
pCurrent->m_pLeft=pListIndex;//当前节点的左孩子指向前驱节点
pListIndex->m_pRight=pCurrent;//前驱节点的右孩子指向当前节点
pListIndex=pCurrent;//更新前驱节点
}


}
int 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);
pListIndex=pHead;
//验证双向链表
while(pListIndex->m_pRight)
{
cout<<pListIndex->m_nValue<<endl;
cout<<endl;
pListIndex=pListIndex->m_pRight;
}
//pListIndex=pListIndex->m_pLeft;
while(pListIndex)
{
cout<<pListIndex->m_nValue<<endl;
cout<<endl;
pListIndex=pListIndex->m_pLeft;
}
return 0;
}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1136255
帖子:227251
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP