为了以后能够找个工作苟活下去,最近开始刷Leetcode了。。。惨,还TMD要用Python,感觉刷题没有C++好用。。虽然以前搞过竞赛吧(划水的那种),但是毕竟不是科班出身,数据结构基础简直薄弱。说实话,今天第一次听说平衡二叉搜索树的概念(竞赛很少有二叉树的题就没怎么看过。。)。
Leetcode链接:https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/description/
所谓的二叉搜索树,有以下三个条件:
1、左边节点不为空的话,数值小于根节点数值
2、右边节点不为空的话,数值大于根节点数值
3、左右子树也是二叉搜索树
而平衡二叉搜索树则是在二叉搜索树的基础上增加了二个条件:
1、左子树和右子树的深度差小于等于1
2、左右子树均为平衡二叉树
题目中给了一个排了序的列表,让我们建立一个平衡二叉搜索树,由于返回的是一个列表,所以,还得做一次遍历。有排好序的列表,建立一个平衡树简直简单,思路很简单:取中值为根节点,剩下的左边列表作为左子树,右边列表作为右子树(正好满足了搜索树的条件1,2),然后通过递归的方式即可生成平衡二叉搜索树(感觉二叉树问题递归无敌。。)。遍历我用了队列的方式,读一个节点,把它出队,把它左右节点压入待搜索队列(不一定最好,瞎写的感觉很low)。
上个代码:
#encoding=utf-8
import numpy as np
# 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 createTree(self, nums):
if nums == []:
return None
n = len(nums)
root = TreeNode(nums[n / 2])
root.left = self.createTree(nums[0 : n/2])
# print root.left.val
root.right = self.createTree(nums[n/2+1 : n])
# print root.left.val
return root
def searchTree(self, root):
if root == None:
return []
Queue = [root]
ans = [root.val]
top = 0
i = 0
while i <= top:
if Queue[i] == None:
i += 1
continue
Queue.append(Queue[i].left)
Queue.append(Queue[i].right)
if Queue[i].left == None:
ans.append(None)
else:
ans.append(Queue[i].left.val)
if Queue[i].right == None:
ans.append(None)
else:
ans.append(Queue[i].right.val)
i += 1
top += 2
n = len(ans)
while ans[n-1] == None:
n -= 1
return ans[0:n]
def sortedArrayToBST(self, nums):
"""
:type nums: List[int]
:rtype: TreeNode
"""
root = self.createTree(nums)
return self.searchTree(root)
# s = Solution()
# print s.sortedArrayToBST([-10,-3,0,5,9])