将二叉查找树转换为有序双链表
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; }
相关文章推荐
- 树(1)把二叉查找树转换成有序的双向链表
- 将二叉查找树转换成有序双向链表
- 二叉查找树转换为有序双向链表---微软
- 二叉查找树转换成有序的双向链表
- 二叉查找树转换为有序双向链表
- 将二叉查找树转换为有序的双向链表
- 17 将二叉排序树转换为有序双链表
- Python中将字典转换为有序列表、无序列表的方法
- 【谷歌面试题】有序输出两棵二叉查找树中的元素
- lintcode:将二叉查找树转换成双链表
- 根据有序数组构造二叉查找树 Convert Sorted Array to Binary Search Tree
- LeetCode | Convert Sorted Array to Binary Search Tree(有序数组转换成平衡二叉树搜索树)
- 有序双链表的建立
- 二叉查找树输出【谷歌面试题】有序输出两棵二叉查找树中的元素
- BST树转换为有序双向循环链表
- Lintcode 将二叉查找树转换成双链表
- LeetCode 108. 将有序数组转换为二叉搜索树
- 二叉查找树转换为顺序的双向链表
- 【学习点滴-数据结构-二叉树】二叉查找树转换成双链表
- 有序数组转为二叉查找树