#include <iostream>
#include <iterator>
#include <algorithm>
using namespace std;
/******************** 题目1 *************************
二元查找树转化为排序的双向列表
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
*/
struct BSTreeNode
{
int nValue;
BSTreeNode* left;
BSTreeNode* right;
BSTreeNode(int n)
{
nValue = n;
left = NULL;
right = NULL;
}
};
//前一个节点指针
BSTreeNode* gPreNode = NULL;
//头节点
BSTreeNode* gHead = NULL;
void BSTreeAddNode(BSTreeNode*& pNode, int nNode)
{
if (pNode == NULL)
{
pNode = new BSTreeNode(nNode);
pNode->left = NULL;
pNode->right = NULL;
}
else if (pNode->nValue > nNode)
{
BSTreeAddNode(pNode->left, nNode);
}
else if(pNode->nValue < nNode)
{
BSTreeAddNode(pNode->right, nNode);
}
else
{
cout << "Same Node" << endl;
}
}
void TransToListNode(BSTreeNode* pNode)
{
if (gPreNode == NULL)
{
gPreNode = pNode;
gHead = pNode;
return;
}
gPreNode->right = pNode;
pNode->left = gPreNode;
gPreNode = pNode;
}
void PrintList(BSTreeNode* pHead)
{
for (pHead; pHead != NULL; pHead = pHead->right)
{
cout << pHead->nValue << " ";
}
cout << endl;
}
void MidOrderPrint(BSTreeNode* pRoot)
{
if (pRoot == NULL)
{
return;
}
MidOrderPrint(pRoot->left);
//cout << pRoot->nValue << " ";
TransToListNode(pRoot);
MidOrderPrint(pRoot->right);
}
int main()
{
BSTreeNode* pRoot = new BSTreeNode(100);
BSTreeAddNode(pRoot, 1);
BSTreeAddNode(pRoot, 120);
BSTreeAddNode(pRoot, 50);
BSTreeAddNode(pRoot, 0);
BSTreeAddNode(pRoot, 40);
MidOrderPrint(pRoot);
PrintList(gHead);
system("pause");
}
二叉排序树转化为排序的双向链表
最新推荐文章于 2018-10-25 22:06:59 发布