博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Leetcode: Convert Sorted List to Binary Search Tree
阅读量:5345 次
发布时间:2019-06-15

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

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

目前做法:

1 /** 2  * Definition for singly-linked list. 3  * public class ListNode { 4  *     int val; 5  *     ListNode next; 6  *     ListNode(int x) { val = x; } 7  * } 8  */ 9 /**10  * Definition for a binary tree node.11  * public class TreeNode {12  *     int val;13  *     TreeNode left;14  *     TreeNode right;15  *     TreeNode(int x) { val = x; }16  * }17  */18 public class Solution {19     public TreeNode sortedListToBST(ListNode head) {20         if (head == null) return null;21         return buildTree(head, null);22     }23     24     public TreeNode buildTree(ListNode head, ListNode end) {25         if (head == end) return null;26         ListNode fast = head;27         ListNode slow = head;28         while (fast != end && fast.next != end) {29             fast = fast.next.next;30             slow = slow.next;31         }32         TreeNode root = new TreeNode(slow.val);33         root.left = buildTree(head, slow);34         root.right = buildTree(slow.next, end);35         return root;36     }37 }

 

第一遍做法:难度70,与Convert Sorted Array to Binary Search Tree问题相似,这道题的做法就是,我们需要中点来做每一层树的根,问题在于,对于一个链表我们是不能常量时间访问它的中间元素的。于是我的想法是花O(N)的时间把链表里面的元素先存到一个数组或者ArrayList里面,这样就有了一个sorted的数组或者ArrayList,我们就很容易对它递归来建立一个height balanced BST

 Code Ganker有一个做法,整体过程就是一次中序遍历,时间复杂度是O(n),空间复杂度是栈空间O(logn)加上结果的空间O(n),额外空间是O(logn),总体是O(n)。代码如下:我的额外空间是O(N),他的做法比我优。

他的做法精髓在于:1. helper函数里递归实现了树的inorder访问,ArrayList<ListNode> list中list.get(0).val存的就是当前树inorder遍历正遍历到的节点其value值。我们依次把LinkedList里面的节点挨个添加到list.get(0),由于LinkedList是sorted的,所以LinkedList里面的点与BST inorder遍历的各个点是一一对应的,我们只需要用当前LinkedList节点的val去创建BST当前的节点就好了。

2. helper函数的 int l, int r看似不影响中序遍历,但是却帮助我们判断什么时候当前节点是null,作用就跟中序遍历递归写法里面的判空语句 if(root == null)return; 一样

1 public TreeNode sortedListToBST(ListNode head) { 2     if(head == null) 3         return null; 4     ListNode cur = head; 5     int count = 0; 6     while(cur!=null) 7     { 8         cur = cur.next; 9         count++;10     }11     ArrayList
list = new ArrayList
();12 list.add(head);13 return helper(list,0,count-1);14 }15 private TreeNode helper(ArrayList
list, int l, int r)16 {17 if(l>r)18 return null;19 int m = (l+r)/2;20 TreeNode left = helper(list,l,m-1);21 TreeNode root = new TreeNode(list.get(0).val);22 root.left = left;23 list.set(0,list.get(0).next);24 root.right = helper(list,m+1,r);25 return root;26 }

 

转载于:https://www.cnblogs.com/EdwardLiu/p/3961052.html

你可能感兴趣的文章
Linux自己安装redis扩展
查看>>
HDU 1016 Prime Ring Problem(dfs)
查看>>
C#中结构体与字节流互相转换
查看>>
session和xsrf
查看>>
Linux目录结构
查看>>
luoguP3414 SAC#1 - 组合数
查看>>
五一 DAY 4
查看>>
(转)接口测试用例设计(详细干货)
查看>>
【译】SSH隧道:本地和远程端口转发
查看>>
图片点击轮播(三)-----2017-04-05
查看>>
直播技术细节3
查看>>
《分布式服务架构:原理、设计于实战》总结
查看>>
java中new一个对象和对象=null有什么区别
查看>>
字母和数字键的键码值(keyCode)
查看>>
IE8调用window.open导出EXCEL文件题目
查看>>
Spring mvc初学
查看>>
有意思的代码片段
查看>>
C8051开发环境
查看>>
VTKMY 3.3 VS 2010 Configuration 配置
查看>>
01_1_准备ibatis环境
查看>>