leetcode — convert-sorted-list-to-binary-search-tree
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Source : https://oj.leetcode.com/problems/convert-sorted-list-to-binary-search-tree/
*
*
* Given a singly linked list where elements are sorted in ascending order,
* convert it to a height balanced BST.
*/
public class ConvertSortedList {
/**
* 将一个有序链表转化为一棵AVL树
* 可以先把单向链表转化为有序数组,然后将数组转化为AVL树
* 或者使用双指针,快指针每次移动两个位置,慢指针每次移动一个位置,这样就能找到中间的节点
*
* 还有一种方法:
* 找到链表总个数total,一次递归如下:
* 递归查找左子树,每次递归的时候将head指向下一个节点
* 左子树递归完成之后,head指向了mid节点
* 构造root节点,当前head指向的就是mid节点,也就是root节点
* 递归构造右子树
* 构造根节点,并返回
*
* @param head
* @return
*/
public TreeNode convert (ListNode head) {
ListNode node = head;
int total = 0;
while (node != null) {
total++;
node = node.next;
}
return convert(new HeadHolder(head), 0, total-1);
}
/**
* 因为每次递归需要改变head的值,所以使用一个HeadHolder指向head,每次修改headHolder的指向
*
* @param head
* @param left
* @param right
* @return
*/
public TreeNode convert (HeadHolder head, int left, int right) {
if (left > right) {
return null;
}
int mid = (left + right) / 2;
TreeNode leftChild = convert(head, left, mid-1);
// 上面递归完成之后,head指向了mid位置的节点
TreeNode root = new TreeNode(head.head.value);
// head的下一个节点就是右子树的第一个节点
head.head = head.head.next;
TreeNode rightChild = convert(head, mid+1, right);
root.leftChild = leftChild;
root.rightChild = rightChild;
return root;
}
private class HeadHolder {
ListNode head;
public HeadHolder(ListNode head) {
this.head = head;
}
}
public ListNode createList (int[] arr) {
if (arr.length == 0) {
return null;
}
ListNode head = new ListNode();
head.value = arr[0];
ListNode pointer = head;
for (int i = 1; i < arr.length; i++) {
ListNode node = new ListNode();
node.value = arr[i];
pointer.next = node;
pointer = pointer.next;
}
return head;
}
public void binarySearchTreeToArray (TreeNode root, List<Character> chs) {
if (root == null) {
chs.add('#');
return;
}
List<TreeNode> list = new ArrayList<TreeNode>();
int head = 0;
int tail = 0;
list.add(root);
chs.add((char) (root.value + '0'));
tail ++;
TreeNode temp = null;
while (head < tail) {
temp = list.get(head);
if (temp.leftChild != null) {
list.add(temp.leftChild);
chs.add((char) (temp.leftChild.value + '0'));
tail ++;
} else {
chs.add('#');
}
if (temp.rightChild != null) {
list.add(temp.rightChild);
chs.add((char)(temp.rightChild.value + '0'));
tail ++;
} else {
chs.add('#');
}
head ++;
}
//去除最后不必要的
for (int i = chs.size()-1; i > 0; i--) {
if (chs.get(i) != '#') {
break;
}
chs.remove(i);
}
}
private class TreeNode {
TreeNode leftChild;
TreeNode rightChild;
int value;
public TreeNode(int value) {
this.value = value;
}
public TreeNode() {
}
}
private class ListNode {
ListNode next;
int value;
public ListNode(int value) {
this.value = value;
}
public ListNode() {
}
}
public static void main(String[] args) {
ConvertSortedList convertSortedList = new ConvertSortedList();
int[] arr = new int[]{1,2,3,4,5,6};
List<Character> chs = new ArrayList<Character>();
TreeNode root = convertSortedList.convert(convertSortedList.createList(arr));
convertSortedList.binarySearchTreeToArray(root, chs);
System.out.println(Arrays.toString(chs.toArray(new Character[chs.size()])));
}
}
leetcode — convert-sorted-list-to-binary-search-tree的更多相关文章
- LeetCode:Convert Sorted Array to Binary Search Tree,Convert Sorted List to Binary Search Tree
LeetCode:Convert Sorted Array to Binary Search Tree Given an array where elements are sorted in asce ...
- Leetcode: Convert sorted list to binary search tree (No. 109)
Sept. 22, 2015 学一道算法题, 经常回顾一下. 第二次重温, 决定增加一些图片, 帮助自己记忆. 在网上找他人的资料, 不如自己动手. 把从底向上树的算法搞通俗一些. 先做一个例子: 9 ...
- [LeetCode] Convert Sorted List to Binary Search Tree 将有序链表转为二叉搜索树
Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...
- [LeetCode] Convert Sorted Array to Binary Search Tree 将有序数组转为二叉搜索树
Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 这道 ...
- leetcode -- Convert Sorted List to Binary Search Tree
Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...
- LeetCode: Convert Sorted List to Binary Search Tree 解题报告
Convert Sorted List to Binary Search Tree Given a singly linked list where elements are sorted in as ...
- LeetCode: Convert Sorted Array to Binary Search Tree 解题报告
Convert Sorted Array to Binary Search Tree Given an array where elements are sorted in ascending ord ...
- LeetCode——Convert Sorted List to Binary Search Tree
Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...
- [LeetCode] Convert Sorted List to Binary Search Tree DFS,深度搜索
Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...
- LeetCode——Convert Sorted Array to Binary Search Tree
Description: Given an array where elements are sorted in ascending order, convert it to a height bal ...
随机推荐
- Codeforces.1129E.Legendary Tree(交互 二分)
题目链接 \(Description\) 有一棵\(n\)个点的树.你需要在\(11111\)次询问内确定出这棵树的形态.每次询问你给定两个非空且不相交的点集\(S,T\)和一个点\(u\),交互库会 ...
- 2018-2019-2 网络对抗技术 20162329 Exp2 后门原理与实践
目录 1.实践基础 1.1.什么是后门 1.2.基础问题 2.实践内容 2.1.使用netcat获取主机操作Shell,cron启动 2.2.使用socat获取主机操作Shell, 任务计划启动 2. ...
- Rectangular Covering [POJ2836] [状压DP]
题意 平面上有 n (2 ≤ n ≤ 15) 个点,现用平行于坐标轴的矩形去覆盖所有点,每个矩形至少盖两个点,矩形面积不可为0,求这些矩形的最小面积. Input The input consists ...
- ionic-基于angularjs实现的多级城市选择组件
大家都知道在移动端的选择地区组件,大部分都是模拟IOS选择器做的城市三级联动,但是在IOS上比较好,在Android上因为有的不支持ion-scroll.所以就会出现滚动不会自动回滚到某一个的正中间. ...
- Java语法细节 - 内存和枚举
目录 Java申请DirectBuffer ByteBuffer的position,limit,capacity,flip操作之间的关系 枚举实现单例模式 Java申请DirectBuffer /*- ...
- redis离线集群安装
用一个叫redis-trib.rb的ruby脚本.redis-trib.rb是redis官方推出的管理redis集群的工具,集成在redis的源码src目录下(redis-xxx/src/).是基于r ...
- Winsock编程基础1
1.加载和释放Winsoke库 //所有Winsock函数都是从WS2_32.DLL导出,包含相应库文件#include <winsock2.h>#pragma comment(lib, ...
- Mesos源码分析(16): mesos-docker-executor的运行
mesos-docker-executor的运行代码在src/docker/executor.cpp中 int main(int argc, char** argv) { GOOGLE_PRO ...
- 最小可用id
题目:在非负数组(乱序)中找到最小的可分配的id(从1开始编号),数据量10000000. 题目解读:在一个不重复的乱序的自然数组中找到最小的缺失的那个数,比如1,2,3,6,4,5,8,11.那么最 ...
- 全面解密QQ红包技术方案:架构、技术实现、移动端优化、创新玩法等
本文来自腾讯QQ技术团队工程师许灵锋.周海发的技术分享. 一.引言 自 2015 年春节以来,QQ 春节红包经历了企业红包(2015 年).刷一刷红包(2016 年)和 AR 红包(2017 年)几个 ...