/*
题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/
6 14
/ /
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
首先我们定义的二元查找树 节点的数据结构如下:
struct BSTreeNode
{
int m_nValue; // value of node
BSTreeNode *m_pLeft; // left child of node
BSTreeNode *m_pRight; // right child of node
};*/
#include "stdafx.h" #include <iostream> using namespace std; struct BSTreeNode { int m_nValue; // value of node BSTreeNode *m_pLeft; // left child of node BSTreeNode *m_pRight; // right child of node }; typedef BSTreeNode DoubleList; DoubleList *pHead; DoubleList *pListIndex; void convertToDoubList(BSTreeNode *pCurrent); //创建二叉树 void addBSTreeNode(BSTreeNode *&pCurrent,int value) { //如果树节点为NULL,创建新的节点 if (pCurrent == NULL) { BSTreeNode *BSNode = new BSTreeNode(); BSNode->m_pRight = NULL; BSNode->m_pLeft = NULL; BSNode->m_nValue = value; pCurrent = BSNode; }else { if(pCurrent->m_nValue > value) { addBSTreeNode(pCurrent->m_pLeft,value); }else { addBSTreeNode(pCurrent->m_pRight,value); } } } //中序遍历,相当于一个排序算法,先遍历左子树,在遍历根节点,最后遍历右子树 void ergodicBSTree(BSTreeNode *pCurrent) { if (pCurrent != NULL) { ergodicBSTree(pCurrent->m_pLeft); convertToDoubList(pCurrent); //cout << pCurrent->m_nValue; //cout << " "; ergodicBSTree(pCurrent->m_pRight); } } void convertToDoubList(BSTreeNode *pCurrent) { pCurrent->m_pLeft = pListIndex; if (NULL != pListIndex) { pListIndex->m_pRight = pCurrent;//双向的~ }else { pHead = pCurrent; } pListIndex = pCurrent; cout << pCurrent->m_nValue << " "; } int _tmain(int argc, _TCHAR* argv[]) { BSTreeNode *mRoot = NULL; addBSTreeNode(mRoot,10); addBSTreeNode(mRoot,8); addBSTreeNode(mRoot,6); addBSTreeNode(mRoot,4); addBSTreeNode(mRoot,12); addBSTreeNode(mRoot,14); addBSTreeNode(mRoot,16); ergodicBSTree(mRoot); system("pause"); return 0; }