leetcode 【 Convert Sorted List to Binary Search Tree 】python 实现
题目:
Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
代码:oj测试通过 Runtime: 178 ms
# Definition for a binary tree node
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
#
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None class Solution:
# @param head, a list node
# @return a tree node
def sortedListToBST(self, head):
# special case frist
if head is None:
return None
if head.next is None:
return TreeNode(head.val)
# slow point & fast point trick to divide the list
slow = ListNode(0)
fast = ListNode(0)
slow.next = head
fast.next = head
while fast.next is not None and fast.next.next is not None:
slow = slow.next
fast = fast.next.next
left = head
right = slow.next.next
root = TreeNode(slow.next.val)
slow.next.next = None # cut the connection bewteen right child tree and root TreeNode
slow.next = None # cut the connection between left child tree and root TreeNode
root.left = self.sortedListToBST(left)
root.right = self.sortedListToBST(right)
return root
思路:
binary search tree 是什么先搞清楚
由于是有序链表,所以可以采用递归的思路,自顶向下建树。
1. 每次将链表的中间节点提出来;链表中间节点之前的部分作为左子树继续递归;链表中间节点之后的部分作为右子树继续递归。
2. 停止递归调用的条件是传递过去的head为空(某叶子节点为空)或者只有一个ListNode(到某叶子节点了)。
找链表中间节点的时候利用快慢指针的技巧:注意,因为前面的special case已经将传进来为空链表和长度为1的链表都处理了,所以快慢指针的时候需要判断一下从最短长度为2的链表的处理逻辑。之前的代码在while循环中只判断了fast.next.next is not None就忽略了链表长度为2的case,因此补上了一个fast.next is not None的case,修改过一次就AC了。
网上还有一种思路,只需要走一次链表就可以完成转换,利用的是自底向上建树。下面这个日志中有说明,留着以后去看看。
http://blog.csdn.net/nandawys/article/details/9125233
leetcode 【 Convert Sorted List to Binary Search Tree 】python 实现的更多相关文章
- [leetcode]Convert Sorted List to Binary Search Tree @ Python
原题地址:http://oj.leetcode.com/problems/convert-sorted-list-to-binary-search-tree/ 题意:将一条排序好的链表转换为二叉查找树 ...
- [leetcode]Convert Sorted Array to Binary Search Tree @ Python
原题地址:http://oj.leetcode.com/problems/convert-sorted-array-to-binary-search-tree/ 题意:将一个排序好的数组转换为一颗二叉 ...
- LeetCode:Convert Sorted Array to Binary Search Tree,Convert Sorted List to Binary Search Tree
LeetCode:Convert Sorted Array to Binary Search Tree Given an array where elements are sorted in asce ...
- Leetcode: Convert sorted list to binary search tree (No. 109)
Sept. 22, 2015 学一道算法题, 经常回顾一下. 第二次重温, 决定增加一些图片, 帮助自己记忆. 在网上找他人的资料, 不如自己动手. 把从底向上树的算法搞通俗一些. 先做一个例子: 9 ...
- [LeetCode] Convert Sorted List to Binary Search Tree 将有序链表转为二叉搜索树
Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...
- [LeetCode] Convert Sorted Array to Binary Search Tree 将有序数组转为二叉搜索树
Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 这道 ...
- leetcode -- Convert Sorted List to Binary Search Tree
Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...
- LeetCode: Convert Sorted List to Binary Search Tree 解题报告
Convert Sorted List to Binary Search Tree Given a singly linked list where elements are sorted in as ...
- LeetCode: Convert Sorted Array to Binary Search Tree 解题报告
Convert Sorted Array to Binary Search Tree Given an array where elements are sorted in ascending ord ...
- LeetCode——Convert Sorted List to Binary Search Tree
Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...
随机推荐
- 使用visio创建数据库模型
使用软件:visio 2007 下载地址:https://pan.baidu.com/s/1i4LG1Id 主要参考:http://blog.csdn.net/zhang_xinxiu/article ...
- 跨平台移动开发phonegap/cordova 3.3全系列教程-开发环境搭建
操作系统:windwos xp 1. 安装JDK 打开如下网站下载JDK http://www.oracle.com/technetwork/java/javase/downloads/index ...
- Python学习笔记-day1(while流程控制)
count = 0 while True: #print('count:',count) if count == 3: print('you guess over 3 times!fuck off!' ...
- HDU 1028 Ignatius and the Princess III伊格和公主III(AC代码)母函数
题意: 输入一个数n,求组合成此数字可以有多少种方法,每一方法是不记录排列顺序的.用来组成的数字可以有1.2.3....n.比如n个1组成了n,一个n也组成n.这就算两种.1=1,2=1+1=2,3= ...
- IOS autosizing(设置控件的固定位置大小)
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...
- noip模拟赛#39
昨晚打开的题想了一会发现都不会后决定慢慢想.然后早上开校会的时候莫名其妙的都想出来了... T1:m=100,ai=50000,i<=5.1到m的数每个数只能用一次,判断是否能够有这些数的某些数 ...
- Android(java)学习笔记80:Html嵌入到Java显示乱码
1. Html嵌入到Java显示乱码: 解决方案: 使用 loadData方法是中文部分会出现乱码,即使指定“utf-8”.“gbk”.“gb2312”也一样. webView.getSettings ...
- bzoj1189 [HNOI2007]紧急疏散
Description 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是一 ...
- Being a Good Boy in Spring Festival(博弈)
Being a Good Boy in Spring Festival Problem Description一年在外 父母时刻牵挂春节回家 你能做几天好孩子吗寒假里尝试做做下面的事情吧 陪妈妈逛一次 ...
- 复习C++_指针、动态分配内存
注意:++i指的是先计算i+1,然后将其赋给i cout<<str[7]<<endl; //输出a 注:交换失败 注意:delete释放之后,变为迷途指针. 注:n--> ...