题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
中序遍历,遍历的过程生成双向链表。
先实现双线链表,然后实现二叉查找树。
class Node {
private int value;
private Node pre = null;
private Node next = null;
private Node prior = null;
public Node(int value) {
this.value = value;
prior = this;
}
public void insert(int value) {
Node node = new Node(value);
prior.next = node;
node.pre = prior;
prior = node;
}
public void print() {
Node node = this;
Node n = null;
while (node != null) {
n = node;
System.out.print(node.value + " ");
node = node.next;
}
System.out.println("-----");
while (n != null) {
System.out.print(n.value + " ");
n = n.pre;
}
}
}
public class BiSearchTree {
private BiSearchTree LeftTree = null;
private BiSearchTree RightTree = null;
private int data;
public BiSearchTree(int data) {
this.data = data;
}
public void insert(int element) {
BiSearchTree tree = this;
BiSearchTree insert_node = new BiSearchTree(element);
BiSearchTree pre = null;
boolean left = true;
while (tree != null) {
pre = tree;
if (tree.data > element) {
left = true;
tree = tree.LeftTree;
} else {
left = false;
tree = tree.RightTree;
}
}
if (left) {
pre.LeftTree = insert_node;
} else {
pre.RightTree = insert_node;
}
}
public void exchange2Link() {
BiSearchTree node = this;
BiSearchTree parent = null;
Stack stack = new Stack();
Node twoDirLinkList = new Node(Integer.MAX_VALUE);
do {
while (node != null) {
stack.push(node);
node = node.LeftTree;
}
BiSearchTree opNode = (BiSearchTree) stack.pop();
twoDirLinkList.insert(opNode.data);
System.out.print(opNode.data + " ");
node = opNode.RightTree;
} while (!stack.IsEmpty() || node != null);
twoDirLinkList.print();
}
public static void main(String[] args) {
// int[] data = {5,2,3,7,4,1,8,6};
// int[] data = {10,5,12,4,7,2,14,12,9};
int[] data = { 10, 5, 12, 4, 7 };
BiSearchTree tree = new BiSearchTree(data[0]);
for (int i = 1; i < data.length; i++) {
tree.insert(data[i]);
}
}
}
分享到:
相关推荐
微软面试题第一题 直接就可以运行 不过二元查找树 不知道怎么自动生成 所以硬生生地一个个敲出来的 为了学习二元树的就不用下了
二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ / \ 4 8 12 16 转换成双向链表 4...
将二元查找树转化为排序的双向链表,实质是利用二元查找树的特性,即所有节点按键值有序排列。这个过程的关键在于保持原有的顺序,同时调整节点间的指针,使得它们形成一个双向链表。下面介绍具体的实现步骤: 1. *...
本文档概述了程序员面试题精选100题,涵盖了C++面试题和笔试题,其中有一道典型的题目是将二元查找树转换成排序的双向链表。 知识点一:二元查找树(Binary Search Tree) * 二元查找树是一种特殊的树数据结构,它...
本题要求将一个二叉搜索树转换为一个排序的循环双向链表。在这个过程中,不能创建新的节点,只能调整树中已有的节点指针。 在双向链表中,每个节点都有两个指针,一个指向它的前驱节点(即顺序上位于其左侧的节点)...
微软面试题,输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。适合新手入门结构清晰易懂
把二叉查找树转变成排序的双向链表 例如: 转换成双向链表 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; // ...
本文将详细介绍其中的一道典型题目:“把二元查找树转变成排序的双向链表”。 #### 题目解析 **题目描述**: 给定一棵二元查找树(Binary Search Tree, BST),将其转换成一个排序的双向链表(Doubly Linked List...
程序员面试题精选 100 题(01)-把二元查找树转变成排序的 双向链表 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点, 只调整指针的指向。 程序员面试题精选 100 题...
本题“把二元查找树转变成排序的双向链表”是一道典型的数据结构转换问题,主要涉及到二元查找树(Binary Search Tree, BST)和双向链表(Double Linked List)的特性。 1. **二元查找树**: - 二元查找树是一种...
根据给定的信息,本文将详细解释“数据结构微软面试”这一主题中的重要知识点,特别是针对“把二元查找树转变成排序的双向链表”这一具体题目进行深入探讨。 ### 数据结构与算法的重要性 在软件开发领域,数据结构...
总的来说,掌握如何将二元查找树转化为排序双向链表的技巧,对于程序员面试至关重要,因为它展示了对数据结构的理解和实际操作能力。同时,熟悉递归思维和二元查找树的性质是解决问题的关键。通过练习此类问题,求职...
1. 把二元查找树转变成排序的双向链表 这道题目要求将一棵二元查找树转换成一个排序的双向链表,不能创建任何新的节点,只调整指针的指向。解决这个问题需要使用递归算法,先将左子树和右子树分别转换成双向链表,...
把二元查找树转变成排序的双向链表 #### 题目解析: 题目要求将一棵二元查找树(Binary Search Tree,BST)转换为一个排序的双向链表(Doubly Linked List)。在这个过程中,不能创建任何新的节点,只能通过调整...
通过对“ms100(微软面试100题)”中的“把二元查找树转变成排序的双向链表”题目的深入解析,我们不仅学习了算法设计的基本思想,还了解了C++中数据结构的定义和操作。此类题目不仅考验应聘者的理论基础,更注重实践...
1. 把二元查找树转变成排序的双向链表:本题目考察了数据结构和算法的知识,要求将二元查找树转换成排序的双向链表。解决方法是首先中序遍历二元查找树,然后调整指针的指向。 2. 设计包含 min 函数的栈:本题目...