1)层序遍历
求最大深度,需要遍历至最后一层。
class Solution:
def maxDepth(self, root: Optional[TreeNode]) -> int:
from collections import deque
if not root:
return 0
que = deque([root])
depth = 0
while que:
size = len(que)
depth += 1
for i in range(size):
cur_node = que.popleft()
if cur_node.left:
que.append(cur_node.left)
if cur_node.right:
que.append(cur_node.right)
return depth
2)深度优先,递归法。
关键是:若当前节点为空,返回0;否则返回其左子树深度、右子树深度中更大者,再加1。
class Solution:
def maxDepth(self, root: Optional[TreeNode]) -> int:
if not root:
return 0
return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1
1)层序遍历
求最小深度,需要在遇到叶子节点时及时退出,因此每次从队列头部取出节点就判断一下是否为叶子。
class Solution:
def minDepth(self, root: Optional[TreeNode]) -> int:
from collections import deque
if not root:
return 0
que = deque([root])
depth = 0
while que:
size = len(que)
depth += 1
for i in range(size):
cur_node = que.popleft()
if cur_node.left == None and cur_node.right == None:
return depth
if cur_node.left:
que.append(cur_node.left)
if cur_node.right:
que.append(cur_node.right)
2)递归法
容易仿照maxDepth写成下面这样,但是错的:
class Solution:
def minDepth(self, root: Optional[TreeNode]) -> int:
if not root:
return 0
return min(self.minDepth(root.left), self.minDepth(root.right)) + 1
错误原因:若当前节点的左右子树一个为空,另一个不为空,会将0+1作为最小深度赋给当前节点。因此需要加如下的判断:若其中一棵子树为空(深度为0)则将另一棵的深度+1赋给当前节点;只有当两棵子树都非空,才能将两子树深度较小者+1赋给当前节点。
class Solution:
def minDepth(self, root: Optional[TreeNode]) -> int:
if not root:
return 0
l_dep = self.minDepth(root.left)
r_dep = self.minDepth(root.right)
if l_dep == 0:
return r_dep + 1
if r_dep == 0:
return l_dep + 1
if l_dep != 0 and r_dep != 0:
return min(l_dep, r_dep) + 1
222. 完全二叉树的节点个数 - 力扣(LeetCode)
class Solution:
def countNodes(self, root: Optional[TreeNode]) -> int:
if not root:
return 0
return 1 + self.countNodes(root.left) + self.countNodes(root.right)