您的位置:首页 > 职场人生

程序员面试100题---1.把二元查找树转变成排序的双向链表

2013-08-27 09:49 295 查看
把二元查找树转变成排序的双向链表

输入:一颗二元查找树,将该二元查找树转换成一个排序的双向链表,要求不能创建任何新的结点,只能调整指针的方向。

在这里要明白几个概念

什么是二元查找数: 它首先要是一棵[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为空。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐