Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.

For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1.

Example:

Given the sorted linked list: [-10,-3,0,5,9],

One possible answer is: [0,-3,9,-10,null,5], which represents the following height balanced BST:

      0
/ \
-3 9
/ /
-10 5

对于将有序的数组转换成平衡二叉搜索树可以使用递归,将中间元素作为根节点,左边元素作为左子树,右边元素作为右子树。从上面的例子看出,当个数为偶数个时,作为根节点的时偏右边的那个中间元素。如-10,-3.是-3作为根节点

所以这个题也是一样,选取链表中间元素作为根节点,递归左右半部分作为左右子树。

因为一开始不会对链表进行这个处理,所以自己将链表遍历到数组中,对数组进行操作简单多了。但是本题很明显要顺便考察对链表的操作,所以后面会参考别人对链表进行直接操作。但是如果真的不会操作链表,就直接转成数组吧,毕竟,做出来最重要。下面先给出转成数组的操作。

/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode sortedListToBST(ListNode head) {
if(head==null) return null;
int len=0;
ListNode node=head;
while(node!=null){
len++;
node=node.next;
}
int[] nums=new int[len];
node=head;
for(int i=0;i<len;i++){
nums[i]=node.val;
node=node.next;
}
return helper(nums,0,len-1); }
public TreeNode helper(int[] nums,int start,int end){
if(start>end) return null;
int mid=(start+end+1)/2; //偶数个元素的时候,选择偏右的那个元素作为根节点。
TreeNode root=new TreeNode(nums[mid]);
root.left=helper(nums,start,mid-1);
root.right=helper(nums,mid+1,end);
return root;
}
}

下面是直接对链表操作。用一个快指针和一个慢指针,快指针是慢指针的两倍。当快指针走到最后一个(奇数个元素),慢指针走到中间,当快指针走到最后元素的后一个(偶数个元素时)慢指针走到中间两个元素偏右那一个,符合上面例子的情况。见代码。

 public TreeNode sortedListToBST(ListNode head) {
if(head==null) return null;
return helper(head,null); //开头跟结尾,开头知道,结尾就用最后一个节点的next
}
//tail表示要生成树的节点的最后一个节点的next节点。
public TreeNode helper(ListNode head,ListNode tail){
if(head==tail) return null;
ListNode fast=head;
ListNode slow=head;
//将fast移到最后一个(tail前一个)或者是最后一个的下一个节点(tail)。此时slow移到中间元素或者中间偏右的那个元素(偶数个元素时)。
while(fast!=tail&&fast.next!=tail){
fast=fast.next.next;
slow=slow.next;
}
TreeNode root=new TreeNode(slow.val);
root.left=helper(head,slow);
root.right=helper(slow.next,tail);
return root; }

convert sorted list to binary search tree(将有序链表转成平衡二叉搜索树)的更多相关文章

  1. Convert Sorted Array to Binary Search Tree(将一个有序数组转换成一颗二叉搜索树)

    Given an array where elements are sorted in ascending order, convert it to a height balanced BST. Fo ...

  2. [LeetCode] 109. 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 ...

  3. [LeetCode] 108. Convert Sorted Array to Binary Search Tree 把有序数组转成二叉搜索树

    Given an array where elements are sorted in ascending order, convert it to a height balanced BST. Fo ...

  4. [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 ...

  5. 【LeetCode-面试算法经典-Java实现】【109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)】

    [109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 ...

  6. [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. 这道 ...

  7. 108. Convert Sorted Array to Binary Search Tree 109. Convert Sorted List to Binary Search Tree -- 将有序数组或有序链表转成平衡二叉排序树

    108. Convert Sorted Array to Binary Search Tree Given an array where elements are sorted in ascendin ...

  8. 108 Convert Sorted Array to Binary Search Tree 将有序数组转换为二叉搜索树

    将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树.此题中,一个高度平衡二叉树是指一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1.示例:给定有序数组: [-10,-3,0,5,9], ...

  9. LeetCode 108. Convert Sorted Array to Binary Search Tree (有序数组转化为二叉搜索树)

    Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 题目 ...

随机推荐

  1. sql中奇怪的sum(1),sum(2),count(1),count(6),count(*):统计总数

    sql的统计函数 sql统计函数有 count 统计条数,配合group用 sum 累加指定字段数值 但注意sum(1)就特殊 sum(1)等同于count(*) sum(1)统计个数,功能和coun ...

  2. [mysql]一次主从数据不一致的问题解决过程

    之前一篇: 主从更换ip之后重新建立同步 情况时这样的 昨天晚上主动2个机器都迁移了,然后今天才把主动重新连接上,但是从库的偏移量是从今天当前时刻开始的,也就是说虽然现在主动看似正常,其实是少了昨天的 ...

  3. android api 镜像站

    项目地址:https://github.com/msdx/androiddoc 访问短址: http://androiddoc.qiniudn.com/

  4. JSP连接MySQL时出现--错误:Access denied for user 'root'@'localhost' (using password: YES)'解决方案

    用代码进行用户验证的时候总是出现这个错误,翻译一下,应该是root用户的是权限的问题没有放开. 那就想办法解决一下吧,具体的来说可以有这样的几种方式. 解决方法,首先想到的是先重启一下MySQL服务吧 ...

  5. 认证模式之Basic模式

    HTTP协议规范中有两种认证方式,一种是Basic认证,另外一种是Digest认证,这两种方式都属于无状态认证方式,所谓无状态即服务端都不会在会话中记录相关信息,客户端每次访问都需要将用户名和密码放置 ...

  6. XBMC源代码简析 5:视频播放器(dvdplayer)-解复用器(以ffmpeg为例)

    XBMC分析系列文章: XBMC源代码分析 1:整体结构以及编译方法 XBMC源代码分析 2:Addons(皮肤Skin) XBMC源代码分析 3:核心部分(core)-综述 XBMC源代码分析 4: ...

  7. Python学习笔记 - dict和set

    dict #!/usr/bin/env python3 # -*- coding: utf-8 -*- #dict >>> d = {'Michael': 95, 'Bob': 75 ...

  8. 4.4、Libgdx使用方法查询运行环境相关属性

    (原文:http://www.libgdx.cn/topic/46/4-4-libgdx%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95%E6%9F%A5%E8%AF%A2%E ...

  9. 【Python】Talk Python To Me Podcast播客

    这是Python相关的一个播客,通过播客的形式给大家讲述python那点事,相关的链接都会列出来,有一些是由文本内容的,如果听不太懂就看看英文原文.不fanqiang的情况下,网页打开没有问题,但是播 ...

  10. 集群通信组件Tribes之如何维护集群成员信息

    一个集群包含若干成员,要对这些成员进行管理就必须要有一张包含所有成员的列表,当要对某个节点做操作时通过这个列表可以准确找到该节点的地址进而对该节点发送操作消息.如何维护这张包含所有成员的列表是本节要讨 ...