程序员面试100题---1.把二元查找树转变成排序的双向链表
2013-08-27 09:49
295 查看
把二元查找树转变成排序的双向链表
输入:一颗二元查找树,将该二元查找树转换成一个排序的双向链表,要求不能创建任何新的结点,只能调整指针的方向。
在这里要明白几个概念
什么是二元查找数: 它首先要是一棵[b]二元树,在这基础上它或者是一棵空树;或者是具有下列性质的二元树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二元查找树[/b]
[b]相信双向链表大家都知道是什么存储结构。具体双向链表如何操作参见本篇文章。[/b]
1、先定义二叉查找树的结点结构
2、转换思路,首先构造一个二叉查找树;然后中序遍历该二叉查找树,这样结点将会被从小到大的访问。
如果之前访问过的结点已经是双向链表了,我们只需要将当前结点链接到双链表的尾部即可。
下面看具体代码:
这里只列出转换代码,具体结点创建和插入代码参考另一篇博文:二叉查找树
具体指针指向调整代码:
其中:curr->lchild = index ; 使当前结点的做指针指向双链表的最后一个结点
如果最后一个元素不存在,则说明,双向链表还未建立,就把当前结点设为头结点:head = curr;
如果双链表已经存在,则使双链表的最后一个节点的右指针指向当前结点。
然后把当前结点curr设置为双链表的最后一个结点。
以此往复,直至BST为空。
输入:一颗二元查找树,将该二元查找树转换成一个排序的双向链表,要求不能创建任何新的结点,只能调整指针的方向。
在这里要明白几个概念
什么是二元查找数: 它首先要是一棵[b]二元树,在这基础上它或者是一棵空树;或者是具有下列性质的二元树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二元查找树[/b]
[b]相信双向链表大家都知道是什么存储结构。具体双向链表如何操作参见本篇文章。[/b]
1、先定义二叉查找树的结点结构
typedef struct node { int data; // value of node BSTnode*lchild; // left child of node BSTnode*rchild; // right child of node }BSTnode;
2、转换思路,首先构造一个二叉查找树;然后中序遍历该二叉查找树,这样结点将会被从小到大的访问。
如果之前访问过的结点已经是双向链表了,我们只需要将当前结点链接到双链表的尾部即可。
下面看具体代码:
这里只列出转换代码,具体结点创建和插入代码参考另一篇博文:二叉查找树
void in_order(BSTnode *curr) { if(NULL == curr) return; if(NULL != curr->lchild) in_order(curr->lchild); couvert(curr); if(NULL != curr->rchild) in_order(curr->rchild); }
具体指针指向调整代码:
BSTnode *index = NULL,*head = NULL; void convert(BSTnode *curr) { if(!curr) return; curr->lchild = index; if(NULL == index) { head = curr; } else { index->rchild = curr; } index = curr; printf("%d,"curr->data); }
其中:curr->lchild = index ; 使当前结点的做指针指向双链表的最后一个结点
如果最后一个元素不存在,则说明,双向链表还未建立,就把当前结点设为头结点:head = curr;
如果双链表已经存在,则使双链表的最后一个节点的右指针指向当前结点。
然后把当前结点curr设置为双链表的最后一个结点。
以此往复,直至BST为空。
相关文章推荐
- 程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表[数据结构]
- 程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表[数据结构]
- 100题_01 把二元查找树转变成排序的双向链表
- 面试100题:1.把二元查找树转变成排序的双向链表
- 算法面试100题——1、把二元查找树转变成排序的双向链表
- 微软100题(1) 二元查找树转变成排序的双向链表
- 程序员面试100题之一,把二元查找树变成排序的双向链表
- 程序员面试题精选---01 把二元查找树转变成排序的双向链表
- (微软100题)把二元查找树转变成排序的双向链表
- To_10_r_100_0---把二元查找树转变成排序的双向链表
- 面试100题:1 把二元查找树转变成排序的双向链表
- 【微软100面试题实现】第01题:把二元查找树转变成排序的双向链表
- 程序员面试题精选(01)-把二元查找树转变成排序的双向链表
- 程序员面试题精选(1):把二元查找树转变成排序的双向链表
- 程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表[数据结构
- 面试100题:1.把二元查找树转变成排序的双向链表
- 程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表
- (程序员面试题精选(01))把二元查找树转变成排序的双向链表
- 【转】100题题1解——把二元查找树转变成排序的双向链表
- 程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表