- 102 二叉树的层序遍历
这道需要一层一层的遍历二叉树,我的思路在解决每层时需要一个队列来存放本层的node个数,每次开始循环前先看队列里有几个node,作为弹出node的个数。
py语法上犯了个错,list1 is [], 用来判断数值list1==[]并且id也要相同,is用来判断是一个对象,这个bug是在IDE调试才想到的。
class Solution:
def levelOrder(self, root):
if not root: return []
rt = []
stack = [root]
while stack:
n = len(stack)
level_rt = [] # 每层node.val放入
for i in range(n): # 要直到本层循环需要弹出几个node
cur = stack.pop(0)
if cur.val: level_rt.append(cur.val)
if cur.left is not None:
stack.append(cur.left)
if cur.right is not None:
# 节点不None入队
stack.append(cur.right)
rt.append(level_rt)
return rt
- 108 将有序数组转换为二叉搜索树
给定有序数组: [-10,-3,0,5,9],一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:
0
/ \
-3 9
/ /
-10 5
思路是找到数组中间的点,使树整体平衡,用递归思想解决:
先提起来中间的点,
然后中间点左边数组去建左树,
然后中间点右边数组去建右树,
每次递归时都是生层了新的数组,List[]生成新对象。
class Solution:
def sortedArrayToBST(self, nums):
if not nums : return None
mid = len(nums)//2
root = TreeNode(nums[mid])
root.left = self.sortedArrayToBST(nums[:mid])
root.right= self.sortedArrayToBST(nums[mid+1:])
return root
- 124 二叉树中的最大路径和
图片来自,也可以参考思想:树的题一般用递归实现,最大路径可能是二叉树从左到右的任意路径的和,所以是由多个局部最大组成全局最大路径, 也可能不路过根节点,局部路径最大。递归实现时候需要用一个缓存保存每次可能出现的路径和。
class Solution:
def maxPathSum(self, root):# TreeNode) -> int:
ans = float("-inf")
def helper(node):
if not node: return 0
left = max(0, helper(node.left))
right = max(0, helper(node.right))
nonlocal ans
# 记录可能出现的某个最大路径
ans = max(ans, node.val+left+right)
# 返回左树路径或右树中的大值
return max(left, right) + node.val
helper(root)
return ans
- 162 寻找峰值
这道题思路很简单,就是二分法查找合适的峰值数数
class Solution:
def findPeakElement(self, nums):
self.ls = nums
if len(self.ls) == 1: return 0# 单个元素
self.rt = 0
self.isPeak(0, len(self.ls)-1)
return self.rt
def isPeak(self, start, end):
# 找到就返回
idx = (start + end) // 2
if start > end: return False
if 0==idx and self.ls[idx]>self.ls[idx+1]: # 左边界,
self.rt = idx
return True
if idx==(len(self.ls)-1) and self.ls[idx]>self.ls[idx-1]: # 中间元素
self.rt = idx
return True
if self.ls[idx-1] < self.ls[idx] > self.ls[idx+1]: # 右边界
self.rt = idx
return True
else:
# 二分搜索
self.isPeak(start, idx-1)
self.isPeak(idx+1, end)
s = Solution()
print(s.findPeakElement([1,2,1,0]))