自底向上

思考方式:对于树中任意一个节点,如果知道它子节点的答案,能够计算出该节点的答案吗?
如果答案是肯定的,那么就可以采用“自底向上”的递归方式。

  1. # Definition for a binary tree node.
  2. # class TreeNode:
  3. # def __init__(self, x):
  4. # self.val = x
  5. # self.left = None
  6. # self.right = None
  7. class Solution:
  8. def maxDepth(self, root: TreeNode) -> int:
  9. # 自底向上
  10. if root is None:
  11. return 0
  12. left = self.maxDepth(root.left)
  13. right = self.maxDepth(root.right)
  14. return max(left, right) + 1

自顶向下

思考方式:对于树中任意节点,能够从该节点自身出发寻找解决问题的答案吗?
确定该节点的一些参数,应该给子节点传递什么参数。

  1. # Definition for a binary tree node.
  2. # class TreeNode:
  3. # def __init__(self, x):
  4. # self.val = x
  5. # self.left = None
  6. # self.right = None
  7. class Solution:
  8. max_deep = 0
  9. def maxDepth(self, root: TreeNode, deep=0) -> int:
  10. # 自顶向下
  11. def dfs(node, depth):
  12. if node is None:
  13. return depth
  14. return max(dfs(node.left,depth+1),dfs(node.right,depth+1))
  15. return dfs(root,0)

ps:也可以层序遍历,计算遍历多少层

  1. class Solution:
  2. def maxDepth(self, root):
  3. """
  4. :type root: TreeNode
  5. :rtype: int
  6. """
  7. stack = []
  8. if root is not None:
  9. stack.append((1, root))
  10. depth = 0
  11. while stack != []:
  12. current_depth, root = stack.pop()
  13. if root is not None:
  14. depth = max(depth, current_depth)
  15. stack.append((current_depth + 1, root.left))
  16. stack.append((current_depth + 1, root.right))
  17. return depth