|
原帖地址: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;
}
|