二叉树最小深度

241 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情

题目描述

给定一个二叉树,找出它的最小深度

ex_depth.jpg

节点定义

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */

思路分析

二叉树最小深度和最大深度不同,最大深度中:只需要遍历到最后一层,最后一层的层数就是最大深度。而最小深度要考虑到多种情况,例如:

  • 根节点为空
  • 根节点不空并且只有一个子树,此时最小深度就是唯一子树的深度
  • 根节点不空并且有两个子树,此时最小深度就是两棵子树深度的最小值

代码实现

class Solution {
public:
    int minDepth(TreeNode* root) {
       //每次遍历都要考虑到三种情况
       //当根节点为空时
        if(root == nullptr) return 0;
        //当根节点不空时依次遍历左右子树
        int left = minDepth(root->left);
        int right = minDepth(root->right);
        //当根节点不空并且只有一个子树(左子树或者右子树)
        if(left==0||right==0)
        //right+left代表根节点的其中一个子树高度(因为此时有一个子树为空),+1代表加上根节点所占的那一层
            return left+right+1;
         //当根节点不空并且有两个子树时,取左子树深度和右子树深度的最小值
        else return min(right,left)+1;
    }
};

难点总结

  • 首先要考虑思路分析中的三种情况
  • 要先对左右子树遍历到底部
  • 再对左右子树的深度进行判断
  • 当有一个子树为空时,左右子树深度记为left+right+1,是为了将左子树为空或者右子树为空的两种情况写到一起,因为此时left和right总有一个取值为0
  • 知识总结: a?b:c 含义是:a条件是否成立?如果条件成立执行 b 语句,如果条件不成立执行 c 语句