链表——有序链表化为平衡二叉查找树

比较直观的解法是自顶向下的递归解决,先找到中间节点作为根节点,然后递归左右两部分。所有我们需要先找到中间节点,题目中要求如果链表结点数为偶,则中间结点为两个中间结点的后一个。对于单链表来说,必须要遍历一边,可以使用快慢指针加快查找速度。

代码如下:

</pre>/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { val = x; next = null; } * } *//** * Definition for binary tree * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */public class Solution {    public TreeNode sortedListToBST(ListNode head) {        if(head == null)              return null;        if(head.next == null){            return new TreeNode(head.val);        }        //用快慢指针找到中间节点        ListNode slow = head;        ListNode fast = head;<p>        ListNode preSlow = null;</p><p></p><p>        /**//找到中间节点的前一个;       * while(fast.next!=null&&fast.next.next!=null)</p><p>       *     {</p><p>       *       preslow=slow;       *       slow=slow.next;       *       fast=fast.next.next;       *     }</p><p>       */</p><p></p>         //找到中间节点的后一个;        while(fast!= null&&fast.next!=null){            preSlow = slow;            slow = slow.next;            fast = fast.next;            if(fast!=null&&fast.next!=null)                {                fast=fast.next;            }        }        //分别递归左右两部分        TreeNode mid = new TreeNode(slow.val);        if(preSlow != null){            preSlow.next = null;            mid.left = sortedListToBST(head);        }        if(slow.next != null){            mid.right = sortedListToBST(slow.next);        }        return mid;    }}<pre name="code" class="java">
时间: 2024-08-29 09:05:08

链表——有序链表化为平衡二叉查找树的相关文章

Java单链表、双端链表、有序链表实现

Java单链表.双端链表.有序链表实现 原创 2014年03月31日 23:45:35 标签: Java / 单链表 / 双端链表 / 有序链表 65040 单链表: insertFirst:在表头插入一个新的链接点,时间复杂度为O(1) deleteFirst:删除表头的链接点,时间复杂度为O(1) 有了这两个方法,就可以用单链表来实现一个栈了,见http://blog.csdn.net/a19881029/article/details/22579759 find:查找包含指定关键字的链接点

根据有序链表构造平衡的二叉查找树

leetcode地址: https://leetcode.com/problems/convert-sorted-list-to-binary-search-tree/description/ 难度:中等 描述: Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. For this problem, a height-balanc

[LeetCode系列]有序链表转换为平衡BST的递归解法

给定有序链表(元素由小到大), 试问如何将其转换为一个平衡BST? 平衡BST: 任意节点的左右子树的深度差值不大于1. 主要思想是用递归. Trick是使用快慢指针来获取中间节点. 获得中间节点后, 将其设为此次递归的root, 随后删除此节点, 并将前一节点的next置NULL. 随后, 对中间节点的前后部分分别进行递归调用, 并将返回值作为其左右子树. 代码如下: 1 /** 2 * Definition for singly-linked list. 3 * struct ListNod

算法之 有序链表和平衡二叉树

题目描述: Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. 给定一个有序的链表,要求构建一颗平衡二叉查找树. 解析:二叉查找树的中序遍历的结构就是一颗二叉查找树,要使得最终的二叉查找树的结构尽可能的平衡,也就是说只需要将左右两边的节点数尽可能的均匀,(注意,此处的均匀是一个递归的概念,也就是说每一个节点的左右子树的节点个数都应

LeetCode(109):有序链表转换二叉搜索树

Medium! 题目描述: 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: [-10, -3, 0, 5, 9], 一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树: 0 / -3 9 / / -10 5 解题思路: 这道题是要求把有序链表转为二叉搜索树,和之前那道Convert Sorted A

有序链表转换二叉搜索树

问题描述: 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: [-10, -3, 0, 5, 9], 一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树: 0 / -3 9 / / -10 5 解题思路: 将链表先转为数组,之后方法与将有序数组转换为二叉搜索树相同. 实现代码: private sta

LeetCode 109. 有序链表转换二叉搜索树(Convert Sorted List to Binary Search Tree)

题目描述 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: [-10, -3, 0, 5, 9], 一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树: 0 / -3 9 / / -10 5 解题思路 转换二叉搜索树分为以下两步: 首先找到链表中间节点以及它的前一个节点,可以利用快慢指针的思想,接着以

LeetCode-合并两个有序链表

.title { text-align: center; margin-bottom: .2em } .subtitle { text-align: center; font-size: medium; font-weight: bold; margin-top: 0 } .todo { font-family: monospace; color: red } .done { font-family: monospace; color: green } .priority { font-fami

合并N个有序链表与FQ公平调度

下大雨了,于是就想表达一些只有下雨才能表达的东西.夜半酒酣惊觉起,使我流泪忆江南-前天晚上下班带着小小在暴雨中狂奔,非常舒服,其实也算是流言终结者吧.反驳一下几千年来在我国北方通过长辈代代相传的淋雨和感冒之间的因果关系. ??昨天早上很早起来,听雨作文,今天早上继续,文章不算太长. 合并两个有序链表 这是一道超级常见的课后作业题或者面试题,网上答案一搜一箩筐,我自己也写了一个不会编程版: 有序链表合并C语言递归版–我稍微会一点编程:https://blog.csdn.net/dog250/art