LC102 二叉树的层序遍历
class Solution:
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
res = []
if root == None:
return res
queue = deque()
queue.append(root)
while queue:
size = len(queue)
list = []
for _ in range(size):
cur = queue.popleft()
list.append(cur.val)
if cur.left:
queue.append(cur.left)
if cur.right:
queue.append(cur.right)
size -= 1
res.append(list)
return res
用队列来实现比较好,迭代!!size的设置主要是为了了解当前层数需要弹出的元素数量。
LC226.翻转二叉树:
class Solution:
def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
#前序或后序遍历
if not root:
return None
root.left, root.right = root.right, root.left #中
self.invertTree(root.left) #左
self.invertTree(root.right) #右
return root
#BFS
queue = deque()
if root:
queue.append(root)
while queue:
size = len(queue)
for i in range(size):
node = queue.popleft()
node.left, node.right = node.right, node.left
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
size -= 1
return root
前序遍历:确定变量,确定终止条件,确定递归逻辑。中左右 或者 左右中 都可以。
BFS:套用模板很好做
LC101.对称二叉树
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 left != None and right == None: return False
elif left == None and right == None: return True
#排除了空节点,再排除数值不相同的情况
elif left.val != right.val: return False
outside = self.compare(left.left, right.right) #左子树:左、 右子树:右
inside = self.compare(left.right, right.left) #左子树:右、 右子树:左
isSame = outside and inside #左子树:中、 右子树:中
return isSame