题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。 比如将二元查找树
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...
将二元查找树转化为排序的双向链表,实质是利用二元查找树的特性,即所有节点按键值有序排列。这个过程的关键在于保持原有的顺序,同时调整节点间的指针,使得它们形成一个双向链表。下面介绍具体的实现步骤: 1. *...
* 在将二元查找树转换成双向链表时,需要注意结点的指针调整,左子树的最大结点和右子树的最小结点需要连接起来,以形成一个排序的双向链表。 知识点四:递归函数(Recursive Function) * 递归函数是一种特殊的...
本题要求将一个二叉搜索树转换为一个排序的循环双向链表。在这个过程中,不能创建新的节点,只能调整树中已有的节点指针。 在双向链表中,每个节点都有两个指针,一个指向它的前驱节点(即顺序上位于其左侧的节点)...
微软面试题,输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。适合新手入门结构清晰易懂
把二叉查找树转变成排序的双向链表 例如: 转换成双向链表 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 题(01)-把二元查找树转变成排序的 双向链表 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点, 只调整指针的指向。 程序员面试题精选 100 题...
本文将详细介绍其中的一道典型题目:“把二元查找树转变成排序的双向链表”。 #### 题目解析 **题目描述**: 给定一棵二元查找树(Binary Search Tree, BST),将其转换成一个排序的双向链表(Doubly Linked List...
本题“把二元查找树转变成排序的双向链表”是一道典型的数据结构转换问题,主要涉及到二元查找树(Binary Search Tree, BST)和双向链表(Double Linked List)的特性。 1. **二元查找树**: - 二元查找树是一种...
根据给定的信息,本文将详细解释“数据结构微软面试”这一主题中的重要知识点,特别是针对“把二元查找树转变成排序的双向链表”这一具体题目进行深入探讨。 ### 数据结构与算法的重要性 在软件开发领域,数据结构...
这其中包括了二元查找树转换为排序双向链表、设计包含min函数的栈、求子数组的最大和、在二元树中找出和为某一值的所有路径、查找最小的k个元素等题目。这些题目都是常见的数据结构和算法面试题目,旨在考察面试者的...
总的来说,掌握如何将二元查找树转化为排序双向链表的技巧,对于程序员面试至关重要,因为它展示了对数据结构的理解和实际操作能力。同时,熟悉递归思维和二元查找树的性质是解决问题的关键。通过练习此类问题,求职...
把二元查找树转变成排序的双向链表 #### 题目解析: 题目要求将一棵二元查找树(Binary Search Tree,BST)转换为一个排序的双向链表(Doubly Linked List)。在这个过程中,不能创建任何新的节点,只能通过调整...
通过对“ms100(微软面试100题)”中的“把二元查找树转变成排序的双向链表”题目的深入解析,我们不仅学习了算法设计的基本思想,还了解了C++中数据结构的定义和操作。此类题目不仅考验应聘者的理论基础,更注重实践...
1. 把二元查找树转变成排序的双向链表:本题目考察了数据结构和算法的知识,要求将二元查找树转换成排序的双向链表。解决方法是首先中序遍历二元查找树,然后调整指针的指向。 2. 设计包含 min 函数的栈:本题目...