一直觉得自己算法和数据结构方面很欠缺,最近放寒假在家里没事,看见网上的这道题目,所以就编写了下,就当作给今年找工作练练手吧,随便也提高下自己这方面的知识。
题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。
比如将二元查找树
转换成双向链表 4=6=8=10=12=14=16
题目来源:
http://zhedahht.blog.163.com/blog/static/254111742007127104759245/
链接中的解决方法其实已经说的很清楚了,并且用C实现了,我只不过是依葫芦画瓢用Java实现了一把。具体解决方案如下:(直接从以上链接中复制的)
当我们到达某一结点准备调整以该结点为根结点的子树时,先调整其左子树将左子树转换成一个排好序的左子链表,再调整其右子树转换右子链表。最近链接左子链表的最右结点(左子树的最大结点)、当前结点和右子链表的最左结点(右子树的最小结点)。从树的根结点开始递归调整所有结点。
package tree;
/**
* 代表树中的单个结点
* @author DHC
*
*/
public class Node {
public Node(int str) {
content = str;
}
private int content;
private Node left;
private Node right;
public Node getLeft() {
return left;
}
public void setLeft(Node left) {
this.left = left;
}
public Node getRight() {
return right;
}
public int getContent() {
return content;
}
public void setContent(int content) {
this.content = content;
}
public void setRight(Node right) {
this.right = right;
}
}
package tree;
/**
* 代表有结点形成的树,要将其变为双向链表
* @author DHC
*
*/
public class Tree {
public static Node rootNode = new Node(10);
static {
Node node6 = new Node(6);
Node node4 = new Node(4);
Node node8 = new Node(8);
Node node14 = new Node(14);
Node node12 = new Node(12);
Node node16 = new Node(16);
rootNode.setLeft(node6);
rootNode.setRight(node14);
node6.setLeft(node4);
node6.setRight(node8);
node14.setLeft(node12);
node14.setRight(node16);
}
public Node getRootNode () {
return rootNode;
}
}
package tree;
/**
* 将树转变为双向链表
* @author DHC
*
*/
public class TreeToList {
private Node convert(Node rootNode, boolean isRight) {
if (rootNode == null) {
return null;
}
Node leftNode = rootNode.getLeft();
Node rightNode = rootNode.getRight();
// 左右节点为空
if (leftNode != null) {
Node leftResultNode = convert(leftNode, false);
if (leftResultNode != null) {
rootNode.setLeft(leftResultNode);
leftResultNode.setRight(rootNode);
}
}
if (rightNode != null) {
Node rightResultNode = convert(rightNode, true);
if (rightResultNode != null) {
rightResultNode.setLeft(rootNode);
rootNode.setRight(rightResultNode);
}
}
Node tempNode = rootNode;
if (isRight) {
if (leftNode != null) {
tempNode = leftNode;
}
} else {
if (rightNode != null) {
tempNode = rightNode;
}
}
return tempNode;
}
public static void main(String[] args) {
TreeToList treeToList = new TreeToList();
treeToList.convert(Tree.rootNode, true);
System.out.println(Tree.rootNode.getLeft().getLeft().getLeft().getContent());
System.out.println(Tree.rootNode.getLeft().getLeft().getContent());
System.out.println(Tree.rootNode.getLeft().getContent());
System.out.println(Tree.rootNode.getContent());
System.out.println(Tree.rootNode.getRight().getContent());
System.out.println(Tree.rootNode.getRight().getRight().getContent());
System.out.println(Tree.rootNode.getRight().getRight().getRight().getContent());
}
}
- 大小: 5.6 KB
分享到:
相关推荐
总之,将二元查找树转化为排序的双向链表是数据结构和算法领域的一个经典问题,涉及到了递归和树的遍历方法。在面试准备中,理解和掌握这类问题的解决方案对于提升程序员的面试表现至关重要。同时,面经资源的分享和...
本问题聚焦于一道具体的算法题——将二元查找树(Binary Search Tree, BST)转化为排序的双向链表(Sorted Doubly Linked List)。下面我们将详细解析这个问题及其解决方案。 二元查找树是一种特殊的二叉树,其中每...
把二元查找树转变成排序的双向链表 #### 题目描述 给定一棵二元查找树(Binary Search Tree, BST),将其转换为一个排序的双向链表。在这个过程中,不能创建任何新的节点,只能通过调整节点间的指针指向来完成转换...
#### 一、把二元查找树转变成排序的双向链表 **知识点概述:** 本题考察的是如何利用二叉树的特性将其转化为一个有序的双向链表。二元查找树(也称为二叉搜索树)是一种特殊的二叉树,其中每个节点的左子树上的所有...
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 algorithm.lru LRUCache: 基于JavaLinkedHashMap实现的 LRU 算法 algorithm.consistentHashing ConsistentHash: 一致性Hash算法 algorithm.cap ...
把二元查找树转变成排序的双向链表** - **题目背景**:在计算机科学中,二叉查找树(Binary Search Tree, BST)是一种特殊的二叉树,其中每个节点的值都大于其左子树中的任意节点的值,小于其右子树中的任意节点的...
##### 1.2.1 把二元查找树转变成排序的双向链表 - **问题描述**:给定一个二叉搜索树(BST),将其转化为一个排序的双向链表。 - **解决方案**: - 使用中序遍历的方法,将二叉树中的节点按照从小到大的顺序连接...
欧拉公式求长期率的matlab代码通过Java学习数据结构和算法 您需要对Java编程语言有基本的了解,才能继续使用该存储库中的代码。 目录 链表 堆 队列 二进制搜索树(BST) 堆 哈希表 脱节集联合(联合查找) 特里 后缀...
例如,同样的链表数据结构可以用单向链表、双向链表或循环链表等方式来实现,这些不同的实现方式会影响链表的性能。因此,正确答案是D:一个逻辑数据结构可以有多种存储结构,且各种存储结构影响数据处理的效率。 #...
1. 层次结构模型: 层次结构模型实质上是一种有根结点的定向有序树,IMS(Information Manage-mentSystem)是其典型代表。 2. 网状结构模型:按照网状数据结构建立的数据库系统称为网状数据库系统,其典型代表是DBTG...