有序链表转换二叉搜索树(LeetCode)
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定有序数组: [-10,-3,0,5,9],
一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:
0
/ \
-3 9
/ /
-10 5
/**
* 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;
ListNode l1=head,l2=head;
int count=;
while(l1!=null){
l1=l1.next;
count++; //得到链表的长度
}
// for(int i=0;i<count/2;i++){
// l2=l2.next; //得到链表的中点
// } return buildBST(head,,count-);
}
public TreeNode buildBST(ListNode head,int l,int r){
if(l>r)return null;
int mid=(l+r)/;
ListNode tem=head;
for(int i=;i<mid;i++)tem=tem.next; //每次递归都要遍历链表
TreeNode root=new TreeNode(tem.val);
root.left=buildBST(head,l,mid-);
root.right=buildBST(head,mid+,r);
return root;
}
}
思路2:先转化为数组,再转化为有序数组转换二叉探索树。
参考:
leetcode- 将有序数组转换为二叉搜索树(java)
class Solution {
public TreeNode sortedListToBST(ListNode head) {
if(head==null)return null;
int count=;
ListNode l1=head;
while(l1!=null){
l1=l1.next;
count++;
}
int[] nums=new int[count];
for(int i=;i<count;i++){
nums[i]=head.val;
head=head.next; //转化为数组
}
return buildBST(nums,,count-); //将排序数组转为二叉探索树
}
public TreeNode buildBST(int[] nums,int l,int r){
if(l>r)return null;
int mid=(l+r)/;
TreeNode root=new TreeNode(nums[mid]);
root.left=buildBST(nums,l,mid-);
root.right=buildBST(nums,mid+,r);
return root;
}
}
新的思路:
class Solution {
public TreeNode sortedListToBST(ListNode head) {
//注意若子树只有两个节点,只需以首节点为根构造右子节点为其后节点的子树
if(head==null)return null;
if(head.next==null)return new TreeNode(head.val);
ListNode fast=head,slow=head,last=slow;
while(fast.next!=null&&fast.next.next!=null){
last=slow; //这里执行到最后一步的时候,last只比slow慢一个指针。
slow=slow.next;
fast=fast.next.next;
}
TreeNode root=new TreeNode(slow.val);
fast=slow.next;//fast部分的链表转化为右子树
if(slow!=last){
last.next=null;
root.left=sortedListToBST(head);
}
root.right=sortedListToBST(fast);
return root;
}
}
有序链表转换二叉搜索树(LeetCode)的更多相关文章
- Java实现 LeetCode 109 有序链表转换二叉搜索树
109. 有序链表转换二叉搜索树 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. ...
- LeetCode109. 有序链表转换二叉搜索树
109. 有序链表转换二叉搜索树 问题描述 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超 ...
- LeetCode(109):有序链表转换二叉搜索树
Medium! 题目描述: 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: ...
- LeetCode 109. 有序链表转换二叉搜索树(Convert Sorted List to Binary Search Tree)
题目描述 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: ...
- [LeetCode] 109. 有序链表转换二叉搜索树
题目链接 : https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/ 题目描述: 给定一个单链表,其中的 ...
- LeetCode 中级 - 有序链表转换二叉搜索树(109)
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: [-10 ...
- [LeetCode题解]109. 有序链表转换二叉搜索树 | 快慢指针 + 递归
题目描述 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: ...
- [Swift]LeetCode109. 有序链表转换二叉搜索树 | 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 ...
- Leetcode109. Convert Sorted List to Binary Search Tree有序链表转换二叉搜索树
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: [-10 ...
随机推荐
- Python简单实现多级菜单
# -*- coding: utf-8 -*- # @Time : 2018-06-01 13:40 # @Author : 超人 # @Email : huxiaojiu111@gmail.com ...
- 清除SQL server 记住的用户名和密码
公司更换电脑,清除SQL server 记住的用户名和密码 请按照上图中的位置找到相应的文件SqlStudio.bin,然后把它删除,请放一百个心,这个文件会自动生成的. 需要注意的是,在删除之前一定 ...
- [Baltic2014]friends
嘟嘟嘟 首先想想暴力的做法,枚举加入的字符,然后判断删去这个字符后两个长度为n / 2的字符串是否相等,复杂度O(n2). 所以可以想办法把判断复杂度降低到O(1),那自然就想到hash了.hash是 ...
- php中static静态变量的使用方法详解
php中的变量作用范围的另一个重要特性就是静态变量(static 变量).静态变量仅在局部函数域中存在且只被初始化一次,当程序执行离开此作用域时,其值不会消失,会使用上次执行的结果. 看看下面 ...
- CVE-2017-8046 复现与分析
环境搭建 使用的项目为https://github.com/spring-guides/gs-accessing-data-rest.git里面的complete,直接用IDEA导入,并修改pom.x ...
- 03.Java语言基础
Java程序的组成 关键字,标识符,注释,变量,语句,表达式,数组,方法 关键字 Java语言内部使用了的一些用于特殊用途的词汇,那么在程序中用户不能使用.语言本身保留了一些词汇用于语言的语法等用途. ...
- 多启动引导工具——AIO Boot
该软件功能十分强大 官网介绍的也十分详尽 这里仅仅简单标记一下用来以后查找 https://www.aioboot.com/en/ 效果图: 支持多语言: 简单运用:
- 封装一个统一返回json结果类JsonResult
import java.io.Serializable; public class JsonResult implements Serializable{ private static final l ...
- 企业案例 【故障修复】mysql主从故障解决过程
由于配置有zabbix监控,某日收到zabbix监控主从报警,,查看mysql状态, showslave status \G; slave复制状态有误,SLAVE_SQL_RUNNING为NO, 接着 ...
- 分别编写两个类Point2D,Point3D来表示二维空间和三维空间的点,使之满足下列要求:
(1) Point2D有两个整型成员变量x, y (分别为二维空间的X,Y方向坐标),Point2D的构造方法要实现对其成员变量x, y的初始化. (2)Point2D有一个void型成员方法offs ...