queue:先进后出,广度优先遍历,层序遍历
stack:先进后出,深度优先遍历,递归遍历
102. Binary Tree Level Order Traversal
思路是用queue,pop元素时push他的左右child,用size记录queue的长度,每次pop size个元素(一层)
queue = collections.deque([root])
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
import collections
class Solution(object):
def levelOrder(self, root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
if not root:
return []
queue = collections.deque([root])
result = []
while queue:
level = []
for i in range(len(queue)):
cur = queue.popleft()
level.append(cur.val)
if cur.left:
queue.append(cur.left)
if cur.right:
queue.append(cur.right)
result.append(level)
return result
107. Binary Tree Level Order Traversal II
翻转result
226. Invert Binary Tree
递归(前中后序),非递归
确定递归顺序:用前序(中左右)或者后序(左右中),中序有点绕
递归三部曲
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def invertTree(self, root):
"""
:type root: TreeNode
:rtype: TreeNode
"""
if not root:
return None
root.left, root.right = root.right, root.left
self.invertTree(root.left)
self.invertTree(root.right)
return root
此处代码为前序
101. Symmetric Tree
只能后序遍历(左右中),先看左右孩子是否相等,再中间上传给上层节点
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def isSymmetric(self, root):
"""
:type root: TreeNode
:rtype: 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)
result = outside and inside
return result