104. 二叉树的最大深度
题目链接:力扣
思路:dfs
注意分清二叉树高度和深度的区别,以及分别用什么遍历方式。
根节点的高度是二叉树的最大深度,所以使用后序遍历算出根节点的高度,即是二叉树的最大深度。
也可以使用回溯的思想,用前序遍历。
class Solution:
def maxDepth(self, root: Optional[TreeNode]) -> int:
def getHeight(cur):
if cur == None:
return 0 # 叶子节点高度为1,它的下面高度为0
leftHeight = getHeight(cur.left)
rightHeight = getHeight(cur.right)
height = max(leftHeight, rightHeight) + 1
return height
return getHeight(root)
111. 二叉树的最小深度
题目链接:力扣
思路:dfs
注意根节点“不算”叶子结点。左右孩子都为空的结点才是叶子结点。
注意与上一题的区别。
如下图,最小深度应该为4,因为只有4和5才是叶子结点,而不是1或2。
class Solution:
def minDepth(self, root: Optional[TreeNode]) -> int:
def getHeight(cur):
if cur == None:
return 0
leftheight = getHeight(cur.left)
rightheight = getHeight(cur.right)
# 注意这里的处理
if cur.left == None and cur.right != None:
return rightheight + 1
if cur.left != None and cur.right == None:
return leftheight + 1
else:
return min(leftheight, rightheight) + 1
return getHeight(root)
222. 完全二叉树的节点个数
题目链接:力扣
思路:dfs
普通二叉树解法:
后序遍历或层序遍历均可。
class Solution:
def countNodes(self, root: Optional[TreeNode]) -> int:
def dfs(cur):
if(cur == None):
return 0
leftNum = dfs(cur.left)
rightNum = dfs(cur.right)
curNum = leftNum + rightNum + 1
return curNum
return dfs(root)
利用完全二叉树性质的解法:
终止条件时特判一下当前树是否为满二叉树,若为满二叉树:利用满二叉树公式,节点数 = 2^树深度 - 1。
若不是,按普通二叉树计算。
class Solution:
def countNodes(self, root: Optional[TreeNode]) -> int:
def dfs(cur):
# 终止条件
if(cur == None):
return 0
leftDepth = 0
rightDepth = 0
left = cur.left
right = cur.right
# 二叉树左侧和右侧最外面一直向下指,算出深度
# 若左右深度相等,则为满二叉树,直接用公式算结点
while left != None:
left = left.left
leftDepth += 1
while right != None:
right = right.right
rightDepth += 1
if leftDepth == rightDepth:
return pow(2, leftDepth+1) - 1 #公式
# 单层递归逻辑,同普通二叉树解法
leftNum = dfs(cur.left)
rightNum = dfs(cur.right)
curNum = leftNum + rightNum + 1
return curNum
return dfs(root)