Python - 代码随想录算法训练营第十六天 | LeetCode104.二叉树的最大深度 559.n叉树的最大深度、LeetCode111.二叉树的最小深度、LeetCode222.完全二叉树的节点个数
前言
今天的内容仍然是二叉树。基本都是用长度法做的,递归等二刷再用。
104.二叉树的最大深度
题目链接
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例: 给定二叉树 [3,9,20,null,null,15,7],
返回它的最大深度 3 。
思路:
这道题的思路和昨天的层序遍历是类似的。只是需要加入一个lev变量来记录当前是第几层。 每一层的处理和层序遍历相同。
代码如下:
# 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:
if not root:
return 0
queue = collections.deque([root])
lev = 0
while queue:
for i in range(len(queue)):
cur = queue.popleft()
if cur.left:
queue.append(cur.left)
if cur.right:
queue.append(cur.right)
lev += 1
return lev
559.n叉树的最大深度
题目链接
思路:
和上一道题相比,n叉树会有多个子节点。所以在处理当前层的节点时,处理子节点就不再是左右节点,而是遍历子节点。(可以参考429. N 叉树的层序遍历)
代码如下:
"""
# Definition for a Node.
class Node:
def __init__(self, val=None, children=None):
self.val = val
self.children = children
"""
class Solution:
def maxDepth(self, root: 'Node') -> int:
if not root:
return 0
queue = collections.deque([root])
lev = 0
while queue:
lev += 1
for i in range(len(queue)):
cur = queue.popleft()
# 多叉树
for child in cur.children:
queue.append(child)
return lev
111.二叉树的最小深度
题目链接
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],
返回它的最小深度 2.
思路:
和最大深度的代码思路类似,都是用lev记录当前层数,然后处理这一层的节点。唯一不同的点是求最小的深度的话,处理每层节点时先判断当前节点,如果没有左右节点,就返回lev
代码如下:
# 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 not root:
return 0
queue = collections.deque([root])
lev = 0
while queue:
lev +=1
for i in range(len(queue)):
cur = queue.popleft()
if not cur.left and not cur.right:
return lev
if cur.left:
queue.append(cur.left)
if cur.right:
queue.append(cur.right)
return lev
222.完全二叉树的节点个数
题目链接
给出一个完全二叉树,求出该树的节点个数。
示例 1:
- 输入:root = [1,2,3,4,5,6]
- 输出:6
示例 2:
- 输入:root = []
- 输出:0
示例 3:
- 输入:root = [1]
- 输出:1
思路:
层序遍历的代码基础上,用counter变量存储节点的数量。处理节点时,如果有左右节点那就+1 。
代码如下:
# 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 not root:
return 0
queue = collections.deque([root])
counter = 1
while queue:
for i in range(len(queue)):
cur = queue.popleft()
if cur.left:
counter +=1
queue.append(cur.left)
if cur.right:
counter +=1
queue.append(cur.right)
return counter
总结
-
待改进: 二叉树的递归法还需要再继续学习。
-
收获: 二叉树的迭代法已经很熟悉了。