wuyijia

导航

代码随想录算法训练营第十六天|104. 二叉树的最大深度、559. N 叉树的最大深度、111. 二叉树的最小深度、222. 完全二叉树的节点个数

【参考链接】

104. 二叉树的最大深度

【注意】

1.

  • 二叉树节点的深度:指从根节点该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)。
  • 二叉树节点的高度:指从该节点叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)。

2.根节点的高度就是二叉树的最大深度,所以本题中我们通过后序求的根节点高度来求的二叉树最大深度。

3.通过后序把结果传递给父节点,父节点再加1。

4.真正求深度是用前序。

5.最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。

【代码】

 1 # Definition for a binary tree node.
 2 # class TreeNode(object):
 3 #     def __init__(self, val=0, left=None, right=None):
 4 #         self.val = val
 5 #         self.left = left
 6 #         self.right = right
 7 class Solution(object):
 8     def maxDepth(self, root):
 9         """
10         :type root: TreeNode
11         :rtype: int
12         """
13         #1.递归法
14         return self.getdepth(root)
15     
16     def getdepth(self,node):
17         if not node:
18             return 0
19         leftheight = self.getdepth(node.left)
20         rightheight = self.getdepth(node.right)
21         height = 1 + max(leftheight,rightheight)
22 
23         return height

559. N 叉树的最大深度

【代码】

 1 """
 2 # Definition for a Node.
 3 class Node(object):
 4     def __init__(self, val=None, children=None):
 5         self.val = val
 6         self.children = children
 7 """
 8 
 9 class Solution(object):
10     def maxDepth(self, root):
11         """
12         :type root: Node
13         :rtype: int
14         """
15         #1.迭代法
16         if not root:
17             return 0
18         
19         max_depth = 1
20 
21         for child in root.children:
22             max_depth = max(max_depth, self.maxDepth(child)+1)
23         return max_depth

111. 二叉树的最小深度

【注意】

1.最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

2.前序求的是深度,后序求的是高度。

3.使用后序遍历,其实求的是根节点到叶子节点的最小距离,就是求高度的过程,不过这个最小距离 也同样是最小深度。

【代码】

 1 # Definition for a binary tree node.
 2 # class TreeNode(object):
 3 #     def __init__(self, val=0, left=None, right=None):
 4 #         self.val = val
 5 #         self.left = left
 6 #         self.right = right
 7 class Solution(object):
 8     def minDepth(self, root):
 9         """
10         :type root: TreeNode
11         :rtype: int
12         """
13         #1.递归法
14         if not root:
15             return 0
16         if not root.left and not root.right:
17             return 1
18         
19         left_depth = float('inf')
20         right_depth = float('inf')
21 
22         if root.left:
23             left_depth = self.minDepth(root.left)
24         if root.right:
25             right_depth = self.minDepth(root.right)
26         
27         return 1 + min(left_depth, right_depth)

222. 完全二叉树的节点个数

【注意】

1.后序遍历实现起来比较简单一些。

2.判断子树是否是满二叉树,利用公式2k-1。

3.如何判断是否是满二叉树:向左和向右遍历的深度是一样的(只遍历外侧)---利用完全二叉树的特点。

【代码】

1.有两个终止条件,第二个是判断子树是否是满二叉树,如果是直接利用公式返回节点个数。就不用遍历这个满二叉树的所有节点,就能统计所有节点。

 1 # Definition for a binary tree node.
 2 # class TreeNode(object):
 3 #     def __init__(self, val=0, left=None, right=None):
 4 #         self.val = val
 5 #         self.left = left
 6 #         self.right = right
 7 class Solution(object):
 8     def countNodes(self, root):
 9         """
10         :type root: TreeNode
11         :rtype: int
12         """
13         #完全二叉树写法
14         if not root:
15             return 0
16         left = root.left
17         right = root.right
18         leftDepth = 0
19         rightDepth = 0
20         #求左子树深度
21         while left:
22             left = left.left
23             leftDepth += 1
24         while right:
25             right = right.right
26             rightDepth += 1
27         if leftDepth == rightDepth:
28             #注意(2<<1) 相当于2^2,所以leftDepth初始为0
29             return (2 << leftDepth) - 1
30         return self.countNodes(root.left) + self.countNodes(root.right) + 1
31     #     return self.getNodesNum(root)
32     # #普通二叉树的递归方法
33     # def getNodesNum(self, node):
34     #     if not node:
35     #         return 0
36     #     leftNum = self.getNodesNum(node.left)
37     #     rightNum = self.getNodesNum(node.right)
38     #     treeNum = leftNum + rightNum + 1
39 
40     #     return treeNum

 

posted on 2023-05-26 17:17  小吴要努力  阅读(22)  评论(0)    收藏  举报