博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode----109. Convert Sorted List to Binary Search Tree
阅读量:4112 次
发布时间:2019-05-25

本文共 2248 字,大约阅读时间需要 7 分钟。

链接:

大意:

给定一个有序链表,将其转成平衡二叉树。例子:

思路:

先将链表中的值依次取出,存入数组。再对数组类似二分查找找到中间的值作为当前树的根节点,同理构造左子树和右子树。

代码:

/** * 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;        List
list = new ArrayList<>(); while (head != null) { list.add(head.val); head = head.next; } Integer[] array = new Integer[list.size()]; list.toArray(array); return buildTree(array, 0, array.length - 1); } public TreeNode buildTree(Integer[] array, int s, int e) { if (s > e) return null; int mid = (s + e) / 2; TreeNode root = new TreeNode(array[mid]); root.left = buildTree(array, s, mid - 1); root.right = buildTree(array, mid + 1, e); return root; }}

结果:

结论:

时间效率这么低.... 改进ing...

最佳:

对链表使用快慢指针找到给定区间的中间元素,这样空间复杂度即为O(1)

/** * 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;        return helper(head, null);    }    private TreeNode helper(ListNode start, ListNode end) {        if(start == null)             return null;        if(start == end)             return new TreeNode(start.val);        ListNode fast = start, slow = start, pre = null;        // 使用快慢指针找到链表在[start, end)的中间元素        while(fast != end && fast.next != end) {            fast = fast.next.next;            pre = slow;            slow = slow.next;        }        TreeNode root = new TreeNode(slow.val);        if(pre != null)            root.left = helper(start, pre);        root.right = helper(slow.next, end);        return root;    }}

 

 

 

 

转载地址:http://rtesi.baihongyu.com/

你可能感兴趣的文章
Spring框架的ImportSelector到底可以干嘛
查看>>
Mysql中下划线问题
查看>>
微信小程序中使用npm过程中提示:npm WARN saveError ENOENT: no such file or directory
查看>>
Xcode 11 报错,提示libstdc++.6 缺失,解决方案
查看>>
idea的安装以及简单使用
查看>>
Windows mysql 安装
查看>>
python循环语句与C语言的区别
查看>>
Vue项目中使用img图片和background背景图的使用方法
查看>>
vue 项目中图片选择路径位置static 或 assets区别
查看>>
vue项目打包后无法运行报错空白页面
查看>>
Vue 解决部署到服务器后或者build之后Element UI图标不显示问题(404错误)
查看>>
element-ui全局自定义主题
查看>>
facebook库runtime.js
查看>>
vue2.* 中 使用socket.io
查看>>
openlayers安装引用
查看>>
js报错显示subString/subStr is not a function
查看>>
高德地图js API实现鼠标悬浮于点标记时弹出信息窗体显示详情,点击点标记放大地图操作
查看>>
初始化VUE项目报错
查看>>
vue项目使用安装sass
查看>>
HTTP和HttpServletRequest 要点
查看>>