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. Spark技术内幕:Master基于ZooKeeper的High Availability(HA)源码实现

    如果Spark的部署方式选择Standalone,一个采用Master/Slaves的典型架构,那么Master是有SPOF(单点故障,Single Point of Failure).Spark可以 ...

  2. NoSQL数据库之Redis数据库:Redis的介绍与安装部署

     NoSQL(NoSQL = Not Only SQL),它指的是非关系型的数据库.随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的w ...

  3. 【设计模式】java设计模式总述及观察者模式

    今天在准备腾讯的面试时想起来要复习一下设计模式,而刚好前几天在参加网易的在线考试的时候,也出了一道关于设计模式的选择题,主要是考察观察者模式,虽然那道题自己做对了,但觉得还是应该好好总结一下设计模式的 ...

  4. Oracle EBS SLA 详解

    SLA概述 SLA :子分类账(Subledger Accounting),这个在R12中大力宣扬的内容,我们通常的认为总账就是对Journal的汇总,但是在实际的操作中我们会发现,对于Sub sys ...

  5. UNIX环境高级编程——信号说明列表

    $ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGK ...

  6. ROC曲线的AUC(以及其他评价指标的简介)知识整理

    相关评价指标在这片文章里有很好介绍 信息检索(IR)的评价指标介绍 - 准确率.召回率.F1.mAP.ROC.AUC:http://blog.csdn.net/marising/article/det ...

  7. Cocos2D:塔防游戏制作之旅(十六)

    编译运行你的app,放置一些炮塔在你的地图上吧!你将看到炮塔在敌人移动如攻击范围时如何立即开始攻击,并且敌人的血条将随着攻击不断减少知道它们被人道毁灭!胜利即将来临了! 哦!Okay,这里只有少数细节 ...

  8. 使用批处理文件(*.bat)同时打多个cmd窗口

    使用批处理文件(*.bat)同时打多个cmd窗口 最近在研究zookeeper,在本地建了几个目录,发现频繁的去各个目录启动zkServer.cmd十分繁琐,于是乎google,才有了下文: 使用批处 ...

  9. IT职场: 选择外企利与弊

    前几天有个同学打电话问我选择国内企业与外企的利弊,很可笑的是他是学机械的:既然和我完全不在一个行业,因此我只是说了我们IT外企的利与弊,毕竟隔行如隔山. 首先简单自我介绍一下,我所在的公司是美资500 ...

  10. 精通mysql之精通EXPLAIN

    EXPLAIN列的解释: table:显示这一行的数据是关于哪张表的 type:这是重要的列,显示连接使用了何种类型.从最好到最差的连接类型为const.eq_reg.ref.range.indexh ...