flowchart TD
A[开始] --> B{当前节点为空?}
B -->|是| C[返回高度0]
B -->|否| D[递归计算左子树高度]
D --> E{左子树不平衡?}
E -->|是| F[返回-1]
E -->|否| G[递归计算右子树高度]
G --> H{右子树不平衡?}
H -->|是| I[返回-1]
H -->|否| J{左右高度差超过1?}
J -->|是| K[返回-1]
J -->|否| L[返回最大高度+1]
M[主函数调用] --> N{高度是否为-1?}
N -->|是| O[返回False]
N -->|否| P[返回True]
111.二叉树1最小深度
# 给定一个二叉树,找出其最小深度。# 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。# 说明:叶子节点是指没有子节点的节点。# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# self.right = rightclassSolution(object):#自己递归法defminDepth(self, root):"""
计算二叉树的最小深度。
参数:
:type root: Optional[TreeNode] - 二叉树的根节点
返回值:
:rtype: int - 从根节点到最近叶子节点的最短路径上的节点数量
算法逻辑:
1. 如果根节点为空,返回0。
2. 如果根节点没有左右子节点,说明是叶子节点,返回1。
3. 如果只有右子树,则递归计算右子树的最小深度并加1。
4. 如果只有左子树,则递归计算左子树的最小深度并加1。
5. 如果左右子树都存在,则分别递归计算左右子树的最小深度,取较小值并加1。
"""# 如果根节点为空,返回0ifnot root:return0# 如果当前节点是叶子节点(无左右子节点),返回1elifnot root.left andnot root.right:return1# 如果只有右子树,递归计算右子树的最小深度并加1elifnot root.left and root.right:return self.minDepth(root.right)+1# 如果只有左子树,递归计算左子树的最小深度并加1elif root.left andnot root.right:return self.minDepth(root.left)+1# 如果左右子树都存在,取左右子树最小深度的较小值并加1elif root.left and root.right:returnmin(self.minDepth(root.left), self.minDepth(root.right))+1#leecode迭代法defminDepth(self, root: TreeNode)->int:ifnot root:return0
que = deque()
que.append(root)
res =1while que:for _ inrange(len(que)):
node = que.popleft()# 当左右孩子都为空的时候,说明是最低点的一层了,退出ifnot node.left andnot node.right:return res
if node.left isnotNone:
que.append(node.left)if node.right isnotNone:
que.append(node.right)
res +=1return res