`
Before_Morning
  • 浏览: 35406 次
文章分类
社区版块
存档分类
最新评论

(一)把二元查找树转变成排序的双向链表

 
阅读更多

题目:

输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。 比如将二元查找树
10
/ \
6 14
/ \ /  \
4 8 12  16
转换成双向链表

4=6=8=10=12=14=16。

分析:本题是微软面试100题的第一题,由于树本身定义就属于递归式定义,所以很多与树相关的题目都是用递归的思路来解决,本题亦是如此。下面我们用两种不同的递归思路来分析。

思路一:中序遍历的顺序即是我们所要建立链表的顺序。所以可以在中序遍历整棵树的同时,通过调整节点的指针来将其转换为双向链表。当所有结点都访问过之后,整棵树也就转换成一个排序双向链表了。<wbr></wbr>

思路二:当我们到达某一结点准备调整以该结点为根结点的子树时,先调整其左子树,将左子树转换成一个排好序的左子链表,再调整其右子树转换右子链表。最后链接左子链表的最右结点(左子树的最大结点)、当前结点和右子链表的最左结点(右子树的最小结点)。从树的根结点开始递归调整所有结点。

#include<stdio.h>
#include<stdlib.h>
struct BiTreeNode
{
int value;
BiTreeNode *left;
BiTreeNode *right;
};

void Convert(BiTreeNode *& head, BiTreeNode *& tail, BiTreeNode *root)
{
BiTreeNode *left, *right;
if (root == NULL)
{
head = NULL;
tail = NULL;
return;
}
Convert(head, left, root->left);
Convert(right, tail, root->right);
if (left!=NULL)
{
left->right = root;
root->left = left;
}
else
{
head = root;
}
if (right!=NULL)
{
root->right=right;
right->left = root;
}
else
{
tail = root;
}

}

BiTreeNode * treeToLinkedList(BiTreeNode * root)
{
BiTreeNode * head, * tail;
Convert(head, tail, root);
return head;//返回链表的头指针
}

/*递归创建二叉排序树,以'-1'结束*/
BiTreeNode * CreateBSTree()
{
int data;
BiTreeNode * tr;
scanf("%d",&data);
if(data==-1)
{
return NULL;
}
else
{
tr = (BiTreeNode *)malloc(sizeof(BiTreeNode));
tr->value=data;
tr->left = CreateBSTree();
tr->right = CreateBSTree();

return tr;
}
}

//中序遍历二叉树
void InOrderTraverse(BiTreeNode * root)
{
if(root->left)
InOrderTraverse(root->left);

if(root)
printf("%d ",root->value);

if(root->right)
InOrderTraverse(root->right);
}
int main()
{
BiTreeNode * root=CreateBSTree();

InOrderTraverse(root);
printf("\n");

BiTreeNode *head=treeToLinkedList(root);

BiTreeNode * temp=head;
while(temp!=NULL)
{
printf("%d ",temp->value);
temp=temp->right;
}

getchar();
return 0;
}

分享到:
评论

相关推荐

    把二元查找树转变成排序的双向链表 源码

    微软面试题第一题 直接就可以运行 不过二元查找树 不知道怎么自动生成 所以硬生生地一个个敲出来的 为了学习二元树的就不用下了

    微软面试题——二元查找树转变成排序的双向链表

    二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ / \ 4 8 12 16 转换成双向链表 4...

    二元查找树转变为双向链表C语言实现

    输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表 要求不能创建任何新的节点,只调整指针的指向 微软面试题

    面试算法总结

    把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ / \ 4 8 12 16 转换成双向链表...

    面试题36. 二叉搜索树与双向链表

    输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。 为了让您更好地理解问题,以下面的二叉搜索树为例: 我们希望将这个二叉搜索树转化为...

    微软面试题(搜索树转双向链表)

    微软面试题,输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。适合新手入门结构清晰易懂

    C++将二叉树转为双向链表及判断两个链表是否相交

    把二叉查找树转变成排序的双向链表 例如: 转换成双向链表 4=6=8=10=12=14=16 struct BSTreeNode { int m_nValue; // value of node BSTreeNode *m_pLeft; // left child of node BSTreeNode *m_pRight; // ...

    程序员面试题精选100题

    程序员面试题精选 100 题(01)-把二元查找树转变成排序的 双向链表 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点, 只调整指针的指向。 程序员面试题精选 100 题...

    微软公司面试题

    把二元查找树转变成排序的双向链表 设计包含min函数的栈。

    数据结构和算法以及详细解答

    1.把二元查找树转变成排序的双向链表 2.设计包含min 函数的栈。 等等

    微软等公司数据结构+算法面试100题(含答案)

    1.把二元查找树转变成排序的双向链表(树) 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / / 6 14 / / / / 4 8 12 16 转换成双向链表 4...

    数据结构算法设计笔试面试题100题内含C语言解析

    数据结构算法设计笔试面试题100题内含C语言解析。 (01)把二元查找树转变成排序的双向链表 (02)设计包含min函数的栈 ...

    算法永远是王道(含微软面试100题)

    算法永远是王道(含微软面试100题) (把二元查找树转变成排序的双向链表;设计包含min函数的栈;求子数组的最大和;在二元树中找出和为某一值的所有路径;查找最小的k个元素等)

    精选微软数据结构算法面试100题

    1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ / \ 4 8 12 16 转换成双向链表 4=6=8=...

    程序员面试题精选100题【数据结构 /算法】

    由第三方作者花费大量时间收集并整理散落在茫茫网络中的面经,并从中精选出若干具有代表性的技术类的面试题展开讨论,希望能给读者带来...把二元查找树转变成排序的双向链表 设计包含min函数的栈 把字符串转换成整数

    leetcodelrucache-algorithm:算法学习和练习

    输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 algorithm.lru LRUCache: 基于JavaLinkedHashMap实现的 LRU 算法 algorithm.consistentHashing ConsistentHash: 一致性Hash算法 algorithm.cap ...

    脑力保健 微软,GOOGLE等试题试做 C#版

    把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ / \ 4 8 12 16 转换成双向...

    算法面试题500

    1.2.1. 把二元查找树转变成排序的双向链表.................................................... 8 1.2.2. 下排每个数都是先前上排那十个数在下排出现的次数 ..........................11 1.2.3. 设计包含 min ...

    软件工程之专题九:数据结构知识

    双向链表是另一种形式的链式结构,双向链表的结点中有两个指针域,其一指向直接后继,另一指向直接前趋。双向链表克服了单链表的单向性的缺点。 前驱方向 后继方向 双向链表也可以有循环表,链表中存在两个...

    计算机二级公共基础知识

    这样的表称为双向链表。 在线性链表中,各数据元素结点的存储空间可以是不连续的,且各数据元素的存储顺序与逻辑顺序可以不一致。在线性链表中进行插入与删除,不需要移动链表中的元素。 线性单链表中,HEAD称为头...

Global site tag (gtag.js) - Google Analytics