您的位置:首页 > 其它

将二叉查找树转换为有序双链表

2014-08-20 23:10 232 查看
#include<iostream>
#include<stdlib.h>

using namespace std;
/*
将二叉查找树如下: 转换为排序双向链表
10
/    \
6     14
/ \    / \
4   8  12 16
转换后的双向链表为4=6=8=10=12=14=16
转换的思想如下:
将二叉查找树种指向左子节点的指针调整为指向前一个结点的指针,
指向右子节点的指针调整为指向下一个结点的指针
这样可以得到     4<-6->8  6<-10->14 12<-14->16
要得到双向链表的有序序列,我们中序遍历二叉查找树就能得到有序的序列
下面讨论如何调整指针,得到这个有序的双向链表
我们可以再根节点将二叉树看作3部分:根节点,左子数,右子数
当我们将10的left指向8,将8的right指向10
由于我们采用的是中序遍历,当遍历到节点10的时候,节点10的左子树已经转换为一个有序
的双向链表,而节点8已经转换为这个有序双向链表的尾结点
所以在这里用一个last_node来保存最后一个节点的指针,用于链接根节点,将这个last_node
指向根节点,对于节点10的右子树,采用类似的操作
*/
struct BSnode
{
int data;
BSnode *left,*right;
};
//定义所需要的数据类型
typedef BSnode *BStree;
typedef BSnode *DList;
typedef BSnode DLnode;

//插入操作
BStree InsertNode(BStree tree,int data);
//转换操作
DList BStreeToDlist(BStree tree);
//调整BStree的指针
void CovertNode(BStree tree,BSnode **last_node);
//查找二叉查找树最左子节点
BSnode *FindMostLeftNode(BStree tree);
//中序输出二叉查找树
void PrintBiTree(BStree tree);
//输出有序双向链表
void PrintDList(DList list);

BStree InsertNode(BStree tree,int data)
{
if(tree==NULL)
{
tree = new BSnode;
tree->left = NULL;
tree->right = NULL;
tree->data = data;
}
else
{
//插入左子树
if(data<tree->data)
tree->left = InsertNode(tree->left,data);
//插入右子树
else
tree->right = InsertNode(tree->right,data);

}
return tree;
}

DList BStreeToDlist(BStree tree)
{
if(tree==NULL)
return tree;
DLnode *head = FindMostLeftNode(tree);
BSnode *last_node = NULL;
CovertNode(tree,&last_node);
return head;
}

BSnode *FindMostLeftNode(BStree tree)
{
if(tree == NULL)
return tree;
while(tree->left != NULL)
tree = tree->left;
return tree;
}

void CovertNode(BStree tree,BSnode **last_node)
{
if(tree == NULL)
return;
//对tree的左子数进行转换
if(tree->left !=NULL)
CovertNode(tree->left,last_node);
tree->left = *last_node;
//调整指向最后一个节点的右指针指向根节点
if(*last_node !=NULL)
(*last_node)->right = tree;
//调整指向链表最后一个结点的指针
*last_node = tree;
//对tree的右子树进行转换,last_node是转换链表后的最后一个指针
if(tree->right != NULL)
CovertNode(tree->right,last_node);
}

void PrintBiTree(BStree tree)
{
if(tree == NULL)
return;
PrintBiTree(tree->left);
cout<<tree->data<<" ";
PrintBiTree(tree->right);
}

void PrintDList(DList list)
{
DLnode *node = list;
while(node !=NULL)
{
cout<<node->data<<" ";
node = node->right;
}
}

int main()
{
BStree tree = NULL;
int a[] ={4,16,10,8,12,14,6,4,7,8,9,1,4,2,3};
cout<<"数字输入的顺序为:"<<endl;
for(int i=0;i<15;i++)
{
cout<<a[i]<<" ";
tree = InsertNode(tree,a[i]);
}
cout<<endl<<"前序遍历该树的结果为:"<<endl;
PrintBiTree(tree);
cout<<endl;
cout<<"转换为有序双向链表的数据为:"<<endl;
tree = BStreeToDlist(tree);
PrintDList(tree);
cout<<endl;
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: