LeetCode109_Convert Sorted List to Binary Search t题目tiTree(将链表转成二叉排序树) Java题解

题目:

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

题解:将一个有序链表转成二叉排序树,如果是一棵相对平衡的排序树,应该是这样的,链表中间那个节点为树的根节点,根节点的左子树节点应该是根节点左边那部分的中间节点,根节点的右节点应该是根节点右边那部分链表的中间节点,后面就按照这个规律依次类推了。知道上面的规律之后,问题的关键点就是寻找一个链表的中间节点了,这个应该是很熟悉的,用快慢两个指针可以轻松解决。下面是这种思路的实现代码:

代码:

//类似归并排序 O(Nlogn)
   public static TreeNode sortedListToBST(ListNode head) {
	   ListNode fast=head;
	   ListNode slow=head;

	   if(head==null)//递归结束条件
		   return null;

	   ListNode leftOfMid=null;//用来记录中间节点的前一个节点,这里把slow指向的节点看做中间及诶单
	   while(fast.next!=null&&fast.next.next!=null)
	   {
		   fast=fast.next.next;
		   leftOfMid=slow;
		   slow=slow.next;
	   }

	   if(leftOfMid==null)//说明没有进入上面的while循环 说明这时候只有1个或两个节点  这时候就不存在左链表的左半部分了
		   head=null;
	   else
		   leftOfMid.next=null;//如果有左半部分则把左半部分链表的末尾指向空,将链表截两段

	   ListNode rightOfMid=slow.next;//链表右半部分的开始

	   TreeNode root=new TreeNode(slow.val);
	   root.left=sortedListToBST(head);
	   root.right=sortedListToBST(rightOfMid);
	   return root;

    }

上面的时间复杂区是n*logn,有没有O(n)的算法呢,新建每一个树节点一遍下来时间复杂度就是o(n)了,所以在寻找中间节点的时候只能是常数时间,这样才能让最终的时间复杂度为O(n),这样只能借助哈希表进行辅助了

代码:

 //用哈希表O(n)时间复杂度
   public static TreeNode sortedListToBST2(ListNode head) {
	   Hashtable< Integer, TreeNode> hashtable=new Hashtable<>();
	   if(head==null)
		   return null;
	   ListNode cur=head;
	   int length=0;
	   while(cur!=null)
	   {

		   TreeNode node=new TreeNode(cur.val);
		   hashtable.put(length,node );
		   cur=cur.next;
		   length++;
	   }

	   return buildTree(0, length-1, hashtable);

   }

   public static TreeNode buildTree(int start,int end,Hashtable<Integer, TreeNode> hashtable) {
	   if(start<=end)
	   {
		   int mid=(start+end)/2;
		   TreeNode root=hashtable.get(mid);
		   root.left=buildTree(start,mid-1 , hashtable);
		   root.right=buildTree(mid+1, end, hashtable);
		   return root;
	   }
	   else {
		return null;
	}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 10:52:41

LeetCode109_Convert Sorted List to Binary Search t题目tiTree(将链表转成二叉排序树) Java题解的相关文章

leetcode 109 Convert Sorted List to Binary Search Tree

题目连接 https://leetcode.com/problems/convert-sorted-list-to-binary-search-tree/ 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. /** * De

leetcode 108 Convert Sorted Array to Binary Search Tree

题目连接 https://leetcode.com/problems/convert-sorted-array-to-binary-search-tree/ Convert Sorted Array to Binary Search Tree Description Given an array where elements are sorted in ascending order, convert it to a height balanced BST. /** * Definition f

LeetCode OJ 108. Convert Sorted Array to Binary Search Tree DFS求解

题目链接:https://leetcode.com/problems/convert-sorted-array-to-binary-search-tree/ 108. Convert Sorted Array to Binary Search Tree My Submissions Question Total Accepted: 68378 Total Submissions: 187560 Difficulty: Medium Given an array where elements ar

Convert Sorted List to Binary Search Tree leetcode java

题目: Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. 题解: 之前做过一道是从sorted array转换到BinarySearchTree的,方法还是一样二分法.但是构造树的方法不是由顶至下了,是要由低至上的建立. 代码如下: 1     static ListNode h; 2   3     public TreeNo

Convert Sorted Array to Binary Search Tree leetcode java

题目: Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 题解: 先复习下什么是二叉搜索树(引自Wikipedia): 二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树: 若任意节点的左子树不空,则左子树

LeetCode: Convert Sorted List to Binary Search Tree [109]

[题目] Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. [题意] 将一个有序链表转换成平衡二叉树 [思路] 思路跟Convert Sorted Array to Binary Search Tree完全一样 [代码] /** * Definition for singly-linked list. * struct List

【一天一道LeetCode】#109. Convert Sorted List to Binary Search Tree

一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. (二)解题 本题大意:给定一个单向链表,构造出平衡二叉搜索树 解题思路:参考[一天一道Leet

LeetCode: Convert Sorted Array to Binary Search Tree [108]

[题目] Given an array where elements are sorted in ascending order, convert it to a height balanced BST. [题意] 给定一个已排序的数组(不存在重复元素),将它转换成一棵平衡二叉搜索树. [思路] 由于平衡二叉树要求左右子树的高度差绝对值相遇等于1,也就是说左右子树尽可能包含相同数目节点. 则使用二分法来解本题即可. [代码] /** * Definition for binary tree *

【LeetCode-面试算法经典-Java实现】【109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)】

[109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. 题目大意 给定一个升序的单链表.将它转换成一颗高度平衡的二叉树 解题思路 解法