【LeetCode 剑指Offer】 二叉树的最大与最小深度

求最大深度和最小深度。

最大深度

题目:

输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

思路:

1,一个二叉树的深度 = 以根节点为root的子树的深度 = max ( 以root->left为root的子树的深度, 以root->right为root的子树的深度 ) + 1

2,如果一个节点为空,则该节点深度为0,或者说如果一个节点没有左右子树,则该节点深度为1

    int TreeDepth(TreeNode* pRoot)
    {
        if(!pRoot)     // 如果到达了空结点,则返回0深度
            return 0;
        int left = TreeDepth(pRoot->left);
        int right = TreeDepth(pRoot->right);
        return max(left, right) + 1;
    }

最小深度

最小深度简单思考可以认为是最大深度类似问题,即一个树的最小深度等于左右子数的最小深度+1。

稍加修改:

    int TreeDepth(TreeNode* pRoot)
    {
        if(!pRoot)     // 如果到达了空结点,则返回0深度
            return 0;
        int left = TreeDepth(pRoot->left);
        int right = TreeDepth(pRoot->right);
        return min(left, right) + 1;
    }

这么做其实与题意不符。最小深度必须要到达一个叶结点,如果一个结点只有单侧结点,上述方法会直接停止,得到错误的最小深度。见下图:

故需要修改,增加判断当前结点的左右结点是否为空:

(1)若有一个为空,则取另一侧的最小长度+1(而不是之前那样取为空位置的深度)

(2)当左右均不为空时再取两者的最小深度。

    int run(TreeNode *root) {
        if (!root)
            return 0;
        if (!root->left)
            return run(root->right)+1;
        if (!root->right)
            return run(root->left)+1;
        return min(run(root->left), run(root->right)) + 1;
    }

猜你喜欢

转载自blog.csdn.net/weixin_38628152/article/details/82083786
今日推荐