104、559和111和层序遍历10道题里面的没区别。
不过卡哥好像用dfs+递归重写了,感觉还是层序遍历的迭代法更好懂啊
104.二叉树的最大深度
①层序遍历,记录层数
②dfs:求出左右子树的最大深度,取较大值
559.n叉树的最大深度
①层序遍历,记录层数。不过用for child in node.children来遍历每个节点的所有子树。而不仅限于左右子树
②dfs:求出左右子树的最大深度,取较大值
111.二叉树的最小深度
①层序遍历,记录层数。左右节点为空时结束循环
②dfs:求出左右子树的最小深度(节点的左右子树都为空),取较小值。但是注意根节点后只有左子树或者只有右子树的情况
222.完全二叉树的节点个数
满二叉树:所有节点都满
完全二叉树:从上到下、从左到右填充,如果有右孩子一定有左节点。但是可以没有右孩子。
和求最大最小深度的思路一样,把所有左节点和所有右节点的节点数加起来即可。
递归好难理解
class Solution:
def countNodes(self, root: TreeNode) -> int:
return self.getNodesNum(root)
def getNodesNum(self, cur):
if not cur:
return 0
leftNum = self.getNodesNum(cur.left) #左
rightNum = self.getNodesNum(cur.right) #右
treeNum = leftNum + rightNum + 1 #中
return treeNum
会一直嵌入调用getNodesNum,直到 cur=None,return 0,而从一层底层返回来的LeftNum和TreeNum会一点一点叠加。
不好理解的是在前一层的递归里,return回来的treeNum值是赋给leftNum和rightNum参与下一层计算的,因此treeNum可以叠加(尝试举例理解),例如其中一步: