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

原帖地址: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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值