代码随想录|二叉树|10二叉树的最小深度

leetcode:111. 二叉树的最小深度 - 力扣(LeetCode)

题目

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

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

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

示例:

给定二叉树 [3,9,20,null,null,15,7],

代码随想录|二叉树|10二叉树的最小深度_第1张图片

返回最小深度2 

思路

同样是前序方法和后序方法,后序遍历的话就是求高度。

递归三部曲

(1)参数和返回值

输入二叉树的根节点,返回int类型的高度

(2)终止条件

遇到空节点返回0

(3)递归逻辑

这里跟求最大深度有区别

代码随想录|二叉树|10二叉树的最小深度_第2张图片

如果直接取1+min(左右孩子)就错了,因为如果有个孩子为空,直接去最小值就会取到0,而我们u需要的是叶子节点的高度开始数起,一直数到根节点。

所以,如果左子树为空,右子树不为空,最小高度=1+右子树高度。

如果左子树不为空,右子树为空,最小高度=1+左子树高度。

如果左右子树都不为空,返回1+左右子树高度最小值。

代码如下:

class Solution
{
    public:
    /**
     * 获取二叉树节点的高度
     * 高度定义为从根节点到最远叶节点的边数
     * 
     * @param node 当前节点的指针
     * @return 当前节点的高度
     */
    int getHeight(TreeNode *node)
    {
        // 如果节点为空,返回高度为0,表示空树
        if(node==NULL)
            return 0;
        
        // 如果节点只有右子树,没有左子树,则高度为右子树的高度加1
        if(node->left==NULL && node->right!=NULL)
            return getHeight(node->right)+1;
        
        // 如果节点只有左子树,没有右子树,则高度为左子树的高度加1
        if(node->left!=NULL && node->right==NULL)
            return getHeight(node->left)+1;
        
        // 如果节点左右子树都存在,则高度为左右子树中较小的高度加1
        // 这里使用较小的高度是为了满足特定的平衡条件或算法需求
        return min(getHeight(node->left),getHeight(node->right))+1;
    }
    int minHeight(TreeNode *root)
    {
        return getHeight(root);
    }
};

总结

前序递归+回溯的方法稍后补上,无论是求最大高度还是最小高度,使用后序还是更为简单。

参考资料

代码随想录 

看起来好像做过,一写就错! | LeetCode:111.二叉树的最小深度_哔哩哔哩_bilibili 

你可能感兴趣的:(算法,数据结构,c++,leetcode,决策树)