109有序链表转化为二叉搜索树

class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
a = ListNode(-10)
b = ListNode(-3)
c = ListNode(0)
d = ListNode(5)
e = ListNode(9)
# a = ListNode(-10)
a.next = b
b.next = c
c.next = d
d.next = e
# 这道题大方向考虑的是递归,递归的进行找到每一个节点。
# 每一个节点就是当前链表的中间节点,如果是偶数,那就是中间靠右节点。
# 注意每次找到中间节点后要把链表分开。左边是左子树,右边是右子树
class Solution:
def sortedListToBST(self, head: ListNode) -> TreeNode:
return self.dfs(head,None)
# 定义函数寻找中间节点
def search_node(self,head,tail):
# 用快慢指针的方法来寻找。
slow,fast = head,head
while fast != tail and fast.next != tail:
slow = slow.next
fast = fast.next.next
# 最后慢指针的位置,就是我们需要的
return slow
def dfs(self,head,tail):
# 头指针指向链表头节点,尾指针指向链表尾节点。
# 如果头节点和尾节点重合,说明不需要进行遍历了。
if head == tail :return
# 寻找中间节点
node = self.search_node(head,tail)
print(node.val)
# 然后将中间节点变成二叉树的节点
root = TreeNode(node.val)
# 寻找左子树
root.left = self.dfs(head,node)
# 寻找右子树
root.right = self.dfs(node.next,tail)
return root

A = Solution()
A.sortedListToBST(a)

posted @ 2020-08-18 10:29  月为暮  阅读(170)  评论(0编辑  收藏  举报