zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    设计模式之工厂模式-抽象工厂(02)
    1036 跟奥巴马一起编程 (15 分)
    1034 有理数四则运算 (20 分)
    1033 旧键盘打字 (20 分)
    1031 查验身份证 (15 分)
    大学排名定向爬虫
    1030 完美数列 (25 分)二分
    1029 旧键盘 (20 分)
    1028 人口普查 (20 分)
    1026 程序运行时间 (15 分)四舍五入
  • 原文地址:https://www.cnblogs.com/cong12586/p/13521987.html
Copyright © 2011-2022 走看看