Day14||104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数

104。二叉树的最大深度

我们用后序深度遍历的方法去遍历。可以写成递归的形式。我们求的其实是高度,因为最大高度和最大深度是一样的。

class Solution {
public:
    int maxDepth(TreeNode* root) {
        if(root==nullptr) return 0;
        int left=maxDepth(root->left);
        int right=maxDepth(root->right);
        int depth=max(left,right)+1;
        return depth;

    }


};

111.二叉树的最小深度

这道题和最大深度的思路很像,但是要注意的是要考虑三种情况,不能无脑取最小值,否则遇到为空的时候就会错。这里用的也是后序遍历。

class Solution {
public:
    int minDepth(TreeNode* root) {
        if(root==nullptr)
        return 0;

        int left=minDepth(root->left);
        int right=minDepth(root->right);

        if(root->left!=nullptr&&root->right!=nullptr)
        return min(left,right)+1;
        if(root->left!=nullptr&&root->right==nullptr)
        return left+1;
        else return right+1;

    }
};

222.完全二叉树的节点个数

这道题还是后序遍历,因为我们需要知道左右子树节点的个数才能统计这棵子树节点的个数。我们可以利用完全二叉树的一些性质来减少运算,完全二叉树的子树也一定是完全二叉树。而完全二叉树如果是满二叉树那么两侧高度应该完全一致,否则一定不是。我们如果遇到是满二叉子树的情况就可以直接利用公式而不用向下递归减少运算量。但是也可以直接暴力递归出所有节点个数。

 class Solution {
public:
    int countNodes(TreeNode* root) {
        if(root==nullptr)
        return 0;

       TreeNode *left=root->left;
       TreeNode *right=root->right;
       int lefthigh=0;
       int righthigh=0;

       while(left!=nullptr)
       {
           left=left->left;
           lefthigh++;
       }
       while(right!=nullptr)
       {
           right=right->right;
           righthigh++;
       }

       if(lefthigh==righthigh)
       return pow(2,lefthigh+1)-1;

       int leftnum=countNodes(root->left);
       int rightnum=countNodes(root->right);
       return leftnum+rightnum+1;

    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值