Leetcode 102. 二叉树的层序遍历
广度优先:队列 深度优先:栈 对于树而言,最重要的就是判断遍历顺序和处理节点顺序是否一致,并且根据需求调整。
一个写的很好的题解: leetcode.cn/problems/bi…
python中的双端队列 deque
class Solution:
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
res=[]
#先判断是否为空
if not root:
return res
from collections import deque
que = deque([root])
while que: #终止条件,队列为空
size=len(que)
tempres=[]
for i in range(size):#每层循环几次,根据当前队列
cur =que.popleft()#当前指针
tempres.append(cur.val)
#要先判断当前指针左右是否为空才能入栈
if cur.left:
que.append(cur.left)
if cur.right:
que.append(cur.right)
#设置tempres和res两个的原因在于,输出是要求一层一个列表,所以每层生成列表之后,再汇总到总列表里面!
res.append(tempres)
return res
Leetcode 226. 翻转二叉树
交换指的是交换指针,而不是交换数值,也就是说下面的左右孩子也是跟着交换的。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
#终止条件,因为一定要翻转,所以判断的是,什么情况下不翻转
if not root:return
#单层循环逻辑
#前序遍历比较好
root.left,root.right = root.right,root.left#python本身就是基于指针
self.invertTree(root.left)#又忘记加self了
self.invertTree(root.right)
return root
迭代(层序)
class Solution:
def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
#if not root:return
from collections import deque
que = deque()
if root:
que.append(root)
while que:
#基于层序遍历,要先确定有
#每层怎么处理
#先把所有结点加入
#基于上层才能确定下层有多少个节点
num = len(que)#要在for循环之前就算好这个数,不然每次for循环que大小会改变,处理不了该层了
for i in range(num): #忘记写range了
#每次弹出节点应该怎么处理
cur=que.popleft()
cur.left,cur.right = cur.right,cur.left#交换
#在队列中加入他们,就像之前的父节点一样
#加入之前要先判断是否为空指针!
if cur.left:
que.append(cur.left)
if cur.right:
que.append(cur.right)
return root
Leetcode 101. 对称二叉树
关于递归终止条件的思考:因为递归的本质在于,大规模和小规模问题的解决模式一致,那么在判断终止条件的时候,只需要拿出来最小规模来制定终止条件。(之前的一个模糊点
递归方法
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def isSymmetric(self, root: Optional[TreeNode]) -> bool:
#先判断
if not root:return True
return self.compare(root.left,root.right)
#定义递归,注意!他不是主函数的子函数!!!
def compare(self,left,right):
#终止条件
if left==None and right!=None:return False
elif right==None and left!=None:return False
elif left ==None and right ==None :return True
#if left.val == right.val: 这句是错的,这是往下递归的基础条件
#要先判断是否为空,在判断是不是数字!要不然会出现空节点的val
elif left.val != right.val:return False
#又忘记加self了
outside = self.compare(left.left,right.right)
inside = self.compare(left.right,right.left)
#返回遍历结果
res = outside and inside
return res
#return compare(root.left,root.right) 调用自身要加self!!!