LC-104.二叉树的最大深度
这道题是一道简单题,可以使用递归法和迭代法进行求解。
迭代法
迭代法最好就使用队列进行层序遍历,这样每遍历一层,深度+1:
class Solution:
def maxDepth(self, root: Optional[TreeNode]) -> int:
if not root: return 0
depth = 0
from collections import deque
que = deque([root])
while que:
depth += 1
size = len(que)
for _ in range(size):
cur = que.popleft()
if cur.left: que.append(cur.left)
if cur.right: que.append(cur.right)
return depth
递归法
递归法这部分其实可以分为前序遍历(中左右),也可以使用后序遍历(左右中)。使用前序求的就是深度,使用后序求的是高度,而根节点的高度就是二叉树的最大深度。
- 前序(中左右)
前序其实就是在递归之前就已经将本层的深度加进去,然后再进行递归,是从上至下的。这体现出了从上之下逐层递归+1的思想。
class Solution:
def maxDepth(self, root: Optional[TreeNode]) -> int:
depth = 0
def digui(root, depth):
# 这里直接返回了depth,所以上一层递归的时候,不需要额外判断左右孩子是否存在。
if not root: return depth
l_d = digui(root.left, depth + 1)
r_d = digui(root.right, depth + 1)
return max(l_d, r_d)
return digui(root, depth)
- 后序遍历(左右中)
后序遍历就是每次从下至上的。也就说到最底层后,每次向上一层返回时,再取左右子树最高的高度后+1,这体现出了从下至上的求高度的过程。
class solution:
def maxdepth(self, root: treenode) -> int:
return self.getdepth(root)
def getdepth(self, node):
if not node:
return 0
leftdepth = self.getdepth(node.left) #左
rightdepth = self.getdepth(node.right) #右
depth = 1 + max(leftdepth, rightdepth) #中
return depth
这里有一道类似的题,思想是一样的,只不过递归的时候,因为是N叉树,不是直接递归左右子树,而是用一个循环依次递归children。每次递归用一个tmp记录,然后找到这个tmp最大值(也就是高度最大的子树),然后加一。
这里有个需要注意的点,如果某个节点没有子树的话,我们循环的时候就会报错,需要提前判断。如果没有children,直接return 1,而不是0。这是为什么呢,因为后序遍历都是先递归返回后再+1,如果没有children没有子树就不会递归,就没有机会去+1,所以我们应该直接去+1.当然,这也就是说,我们的返回条件提前了一层,不是去判断这个节点本身是否存在,而是判断他的children是否存在,如果存在则递归,不存在直接return 1, 而不是0。
class Solution:
def maxDepth(self, root: 'Node') -> int:
# 使用后序遍历
def digui(root):
# if not root:
# return 0
tmp_depth = []
if not root.children: return 1
for child in root.children:
tmp_depth.append(digui(child))
depth = 1 + max(tmp_depth)
return depth
return digui(root)