掌握递归法在二叉树中的应用
104. 二叉树的最大深度
- 递归法
判断左右子树长度 选择较长的
def maxDepth(self, root: Optional[TreeNode]) -> int:
if not root:
return 0
def depth(root, d):
if not root:
return d
ld = depth(root.left, d+1)
rd = depth(root.right, d+1)
d = max(ld, rd)
return d
return depth(root,0)
- 迭代法
def maxDepth(self, root: Optional[TreeNode]) -> int:
if not root:
return 0
queue = [root]
depth = 0
while queue:
n = len(queue)
tmp = []
while n:
node = queue.pop(0)
if node:
tmp.append(node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
n -= 1
depth += 1
return depth
559. N 叉树的最大深度
- 递归法
注意返回值和遍历过程中深度改变的方式
def maxDepth(self, root: 'Node') -> int:
if not root:
return 0
def depth(root, d):
if not root:
return d
d = 0
for c in root.children:
d = max(d, depth(c, d))
return d + 1
return depth(root,0)
- 迭代法
def maxDepth(self, root: 'Node') -> int:
if not root:
return 0
queue = [root]
depth = 0
while queue:
n = len(queue)
tmp = []
while n:
node = queue.pop(0)
if node:
tmp.append(node.val)
if node.children:
for c in node.children:
queue.append(c)
n -= 1
depth += 1
return depth
111. 二叉树的最小深度
- 递归法
【参照随想录】
思考如何排除1的结果(一边子树为空)
def minDepth(self, root: TreeNode) -> int:
if not root:
return 0
if not root.left and not root.right:
return 1
min_depth = 10**9
if root.left:
min_depth = min(self.minDepth(root.left), min_depth) # 获得左子树的最小高度
if root.right:
min_depth = min(self.minDepth(root.right), min_depth) # 获得右子树的最小高度
return min_depth + 1
- 迭代法
def minDepth(self, root: Optional[TreeNode]) -> int:
if not root:
return 0
queue = [root]
depth = 0
while queue:
n = len(queue)
tmp = []
while n:
node = queue.pop(0)
if node:
tmp.append(node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
if not node.left and not node.right:
return depth + 1
n -= 1
depth += 1
return depth
222. 完全二叉树的节点个数
层序遍历统计节点个数
def countNodes(self, root: Optional[TreeNode]) -> int:
"""
:type root: TreeNode
:rtype: int
"""
d = 0
stack = [root]
while stack:
node = stack.pop()
if node:
d += 1
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
return d
层序相关迭代法总结
其实就是构建队列 逐层访问树
根据题目要求的不同调整返回值