#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(BSt
将二叉查找树转换为有序双链表
最新推荐文章于 2022-06-22 10:45:29 发布