104. 二叉树的最大深度:
代码思路
递归套路:要计算这个树的最深深度,则是右子树的最深深度或者左子树的最深深度的较大值。
也就是max(右子树最深深度,左子树最深深度)。
也就是每个递归函数都要返回一个局部最深深度depth。即left_depth = depth(node.left),right_depth = depth(node.right)。
而其实该树的最深深度其实就是max(left_depth, right_depth)。
然后再看叶子节点,叶子节点返回啥呢?叶子节点的左右节点都是空节点,当递归遇到空节点时,肯定是返回一个数值!!而不是返回空。返回的数值就是叶子节点的深度啦。
在函数的参数里面记录当前层的层数。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def maxDepth(self, root: Optional[TreeNode]) -> int:
def find_max(node, layer):
if node == None:
return layer - 1
left_depth = find_max(node.left, layer+1)
right_depth = find_max(node.right, layer + 1)
return max(left_depth, right_depth)
return find_max(root, 1)
111. 二叉树的最小深度:
递归老套路:要知道这棵树的最小深度,则肯定是左子树的最小深度和右子树的最小深度之间的最小值。也就是min(左子树的最小深度, 右子树的最小深度)。
然后左子树的最小深度=find_min(node.left)
右子树的最小深度=find_min(node.right)
再看叶子节点, 这里需要注意,叶子节点的定义是左右子节点均为空才算
所以终止条件要node.left 和 node.right都要是null才可以.
代码思路
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def minDepth(self, root: Optional[TreeNode]) -> int:
if root == None:
return 0
def find_min(node, layer):
if node.left == None and node.right == None:
return layer
if node.left == None and node.right != None:
return find_min(node.right, layer+1)
if node.left != None and node.right == None:
return find_min(node.left, layer+1)
left_depth = find_min(node.left, layer+1)
right_depth = find_min(node.right, layer+1)
return min(left_depth, right_depth)
return find_min(root, 1)
return mindepth(root, 1)
222. 完全二叉树的节点个数:
代码思路
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def countNodes(self, root: Optional[TreeNode]) -> int:
if root == None:
return 0
def bfs(node, layer):
if node != None and node.left == None and node.right == None:
return layer, 1
elif node == None:
return layer, 0
else:
if node.left == None:
return layer + 1, 1
elif node.right == None:
return layer + 1, 1
else:
layer1, bottom_nums1 = bfs(node.left, layer + 1)
layer2, bottom_nums2 = bfs(node.right, layer + 1)
if layer1 > layer2:
return layer1, bottom_nums1
elif layer1 < layer2:
return layer2, bottom_nums2
else:
return layer1, bottom_nums1 + bottom_nums2
layers, bottom_num = bfs(root, 1)
return 2 ** (layers-1) - 1 + bottom_num