Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
Subscribe
to see which companies asked this question
从给定的有序链表生成平衡二叉树。
解题思路:最容易想到的就是利用数组生成二叉树的方法,找到中间节点作为二叉树的root节点,然后分别对左右链表递归调用分别生成左子树和右子树。时间复杂度O(N*lgN)
需要注意的是,递归的时候,需要把mid的下一个节点设为空,这样才能有循环出口。
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def getMid(self,head):
p = head
pre = head
tail = head
while(tail):
#print p.val,tail.val
try:
tail = tail.next.next
except:
return pre
if tail == None:
break
pre = p
p = p.next
return pre
def sortedListToBST(self, head):
#print self.getMid(head).val
if head == None:
return None
if head.next == None:
return TreeNode(head.val)
pre = self.getMid(head)
mid = pre.next
root = TreeNode(mid.val)
right = mid.next
pre.next = None
#print head.val,mid.val
root.left = self.sortedListToBST(head)
root.right = self.sortedListToBST(right)
return root
"""
:type head: ListNode
:rtype: TreeNode
"""