每天一道LeetCode-22(二叉树的最小深度)

47 阅读2分钟

题目描述

给定一个二叉树,找出其最小深度。

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

说明:叶子节点是指没有子节点的节点。

  示例 1:

输入: root = [3,9,20,null,null,15,7]
输出: 2

分析

有了上一题最大高度的铺垫,我们可以如法炮制,采用后序遍历来获取最小深度,不过最小深度的获取并不能直接取左右子树中的最小值,因为当一棵树的所有左子树或所有右子树不存在时,返回值始终是0,因此在返回深度时,我们应该做进一步的判断。

  1. 首先判断递归函数的返回值以及参数,自然是整型以及根节点类型的参数。
  2. 明确结束递归条件,和最大高度一样,当传入节点为空时,返回此时的深度0;
  3. 单层递归,采用后序遍历,于是先获得左右子树的深度,并按条件返回当前子树的深度,这里有三种情况:
  • 左子树为空右子树不为空:此时我们传入的值应该是右子树的深度加上当前节点所占的深度1;
  • 右子树为空左子树不为空:此时我们传入的值应该是左子树的深度加上当前节点所占的深度1;
  • 左右子树均不为空或均为空:此时我们传入的值应该是二者中更小的深度加上1;

代码实现

int getDep(struct TreeNode* p){
    if(p == NULL) return 0;
    int leftDep = getDep(p->left);
    int rightDep = getDep(p->right);
    if(leftDepth == 0 && rightDepth != 0){
        return rightDepth + 1;
    }else if(rightDepth == 0 && leftDepth != 0){
        return leftDepth + 1;
    }else{
        return fmin(leftDepth,rightDepth) + 1;
    }
}

int minDep(struct TreeNode* root){
    return getDep(root);
}