/*
把二叉查找树转化为双向链表
什么是二元查找树?
二元查找树: 它首先要是一棵二元树,在这基础上它或者是一棵空树;或者是具有下列性质的二元树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二元查找树
*/
#include <iostream>
using namespace std;
struct BSTreeNode
{
BSTreeNode *left;
BSTreeNode *right;
int value;
BSTreeNode()
{
left = NULL;
right = NULL;
}
};
typedef BSTreeNode DoubleList;
DoubleList *pHead; //双向链表的头部
DoubleList *pListIndex; //双向链表的索引
//建立二元查找树
void AddNode(BSTreeNode * &pCurrent, int v)
{
if (NULL == pCurrent)
{
BSTreeNode *temp = new BSTreeNode();
temp->value = v;
pCurrent = temp;
}
else
{
if (v < (pCurrent->value))
{
AddNode(pCurrent->left, v);
}
else if (v > (pCurrent->value))
{
AddNode(pCurrent->right, v);
}
else
{
//增加重复的结点
}
}
}
void AddToDoubleList(BSTreeNode *pNode)
{
if (pHead == NULL)
{
pHead = pNode;
}
else
{
pNode->left = pListIndex;
pListIndex->right = pNode;
}
pListIndex = pNode;
}
//中序遍历二元查找数 顺序访问
void Mid(BSTreeNode *pNode)
{
if(pNode == NULL)
{
return;
}
Mid(pNode->left);
/// cout << pNode->value << " ";
AddToDoubleList(pNode);
Mid(pNode->right);
}
void Display(DoubleList *pList)
{
for (BSTreeNode *pNode = pList; pNode; pNode = pNode -> right)
{
cout << pNode->value << " ";
}
cout << endl;
}
int main()
{
BSTreeNode *root = NULL;
pHead = NULL;
pListIndex = NULL;
int n;
int value[100];
while(scanf("%d", &n)!=EOF)
{
for(int i=0; i<n; i++)
for (int i = 0; i < n; i++)
{
AddNode(root, value[i]);
}
Mid(root); //通过中序遍历把二叉查找树转化为双向链表
Display(pHead); //输出该双向链表
}
}
/*
6 2 4 1 9 10 5
1 2 4 5 9 10
*/
把二叉查找树转化为双向链表
什么是二元查找树?
二元查找树: 它首先要是一棵二元树,在这基础上它或者是一棵空树;或者是具有下列性质的二元树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二元查找树
*/
#include <iostream>
using namespace std;
struct BSTreeNode
{
BSTreeNode *left;
BSTreeNode *right;
int value;
BSTreeNode()
{
left = NULL;
right = NULL;
}
};
typedef BSTreeNode DoubleList;
DoubleList *pHead; //双向链表的头部
DoubleList *pListIndex; //双向链表的索引
//建立二元查找树
void AddNode(BSTreeNode * &pCurrent, int v)
{
if (NULL == pCurrent)
{
BSTreeNode *temp = new BSTreeNode();
temp->value = v;
pCurrent = temp;
}
else
{
if (v < (pCurrent->value))
{
AddNode(pCurrent->left, v);
}
else if (v > (pCurrent->value))
{
AddNode(pCurrent->right, v);
}
else
{
//增加重复的结点
}
}
}
void AddToDoubleList(BSTreeNode *pNode)
{
if (pHead == NULL)
{
pHead = pNode;
}
else
{
pNode->left = pListIndex;
pListIndex->right = pNode;
}
pListIndex = pNode;
}
//中序遍历二元查找数 顺序访问
void Mid(BSTreeNode *pNode)
{
if(pNode == NULL)
{
return;
}
Mid(pNode->left);
/// cout << pNode->value << " ";
AddToDoubleList(pNode);
Mid(pNode->right);
}
void Display(DoubleList *pList)
{
for (BSTreeNode *pNode = pList; pNode; pNode = pNode -> right)
{
cout << pNode->value << " ";
}
cout << endl;
}
int main()
{
BSTreeNode *root = NULL;
pHead = NULL;
pListIndex = NULL;
int n;
int value[100];
while(scanf("%d", &n)!=EOF)
{
for(int i=0; i<n; i++)
{
cin >> value[i];
}for (int i = 0; i < n; i++)
{
AddNode(root, value[i]);
}
Mid(root); //通过中序遍历把二叉查找树转化为双向链表
Display(pHead); //输出该双向链表
}
}
/*
6 2 4 1 9 10 5
1 2 4 5 9 10
*/