解题笔记(4)——把二元查找树转变成排序的双向链表
2011-07-15 20:50
316 查看
问题描述:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。
10
/ /
6 14
/ / / /
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
思路:利用递归的思想求解,分别调整某结点的左右子树,调整完后,将该结点的左指针指向左子树的最大节点,右指针指向右子树的最小节点。
代码如下:
测试当中,需要建立二叉搜索树,下面给出建立及遍历二叉树的代码。
本人享有博客文章的版权,转载请标明出处 http://blog.csdn.net/wuzhekai1985
10
/ /
6 14
/ / / /
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
思路:利用递归的思想求解,分别调整某结点的左右子树,调整完后,将该结点的左指针指向左子树的最大节点,右指针指向右子树的最小节点。
代码如下:
BSTreeNode * Convert(BSTreeNode *node) { if(node == NULL) return NULL; BSTreeNode *leftMax,*rightMin; leftMax = node->left; rightMin = node->right; //找到左子树的最大结点 while(leftMax != NULL && leftMax->right != NULL) leftMax = leftMax->right; //找到右子树的最小结点 while(rightMin != NULL && rightMin->left != NULL) rightMin = rightMin->left; //递归求解 Convert(node->right); Convert(node->left); //将左右子树同根结点连起来,只不过是以兄弟的关系 if(leftMax != NULL) leftMax->right = node; if(rightMin != NULL) rightMin->left = node; node->left = leftMax; node->right = rightMin; return node; }
测试当中,需要建立二叉搜索树,下面给出建立及遍历二叉树的代码。
struct BSTreeNode { int value; BSTreeNode *left; BSTreeNode *right; }; BSTreeNode * Insert(BSTreeNode *p, int x) { if(p == NULL) { p = new BSTreeNode; p->value = x; p->left = NULL; p->right = NULL; } else { if(p->value > x) p->left = Insert(p->left, x); if(p->value < x) p->right = Insert(p->right, x); } return p; } void Traverse(BSTreeNode *p) //中序遍历 { if(p == NULL) return; Traverse(p->left); cout<<p->value<<' '; Traverse(p->right); }
本人享有博客文章的版权,转载请标明出处 http://blog.csdn.net/wuzhekai1985
相关文章推荐
- 微软面试题解题笔记——二元查找树转排序双向链表
- 微软面试题系列(一):把二元查找树转变成排序的双向链表
- 【老鸟学算法】二元查找树转变成排序的双向链表——算法思想及java实现
- 1.把二元查找树转变成排序的双向链表
- 1.把二元查找树转变成排序的双向链表
- NO.1 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 二元查找树转变成排序的双向链表之C#算法实现
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 程序员面试题精选(01)-把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表[数据结构]
- 1.把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- [何海涛][数据结构][把二元查找树转变成排序的双向链表]浅析
- 程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表[数据结构
- 【1】二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表