day16 || 二叉树的最大深度,二叉树的最小深度

12 篇文章 0 订阅

理论基础

  • 二叉树的节点的深度:从根节点该节点的最长简单路径边的条数或者节点数 【取决于深度从0开始还是从1开始】

  • 二叉树节点的高度:该节点叶子节点的最长简单路径边的条数或者节点数 【取决于深度从0开始还是从1开始】

前序遍历【中左右】 就是求 叶子节点的深度

后序遍历【左右中】 就是求根节点的高度

104.二叉树的最大深度

题目

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

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

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

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

3

/
9 20
/
15 7
返回它的最大深度 3 。

题解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PeLaNzEv-1668335854886)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\image-20221113162639744.png)]

//递归法

/**
 * 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 getHight(TreeNode* node){
       //递归终止条件
       if(node == nullptr) return 0; //到达叶子节点的左右空孩子,高度为0;
          //单层递归逻辑
       int leftHight = getHight(node ->left); //求左孩子的高度
       int rightHight = getHight(node -> right); //求右孩子的高度

       int result = 1 + max(leftHight,rightHight); //处理中节点
       return result;
     

     }
     
    int maxDepth(TreeNode* root) {
        if(root == nullptr) return 0;
        return getHight(root); //求根节点的高度
    }
};

//迭代法:利用层序遍历来求深度

111.二叉树的最小深度

题目

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

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

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

示例 1:

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

输入:root = [2,null,3,null,4,null,5,null,6]
输出:5

题解

/**
 * 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 getHight(TreeNode* node){
         if(node == nullptr) return 0;
         
         int leftHight = getHight(node ->left);
         int rightHight = getHight(node -> right);

          //int result =  1 + min(leftHight,rightHight) 答案是错的,因为当根节点的左子树为空时,最小深度会返回0,不符合 最小深度是从根节点到最近叶子节点的最短路径上的节点数量 这个定义

          //有 三种情况
               //左子树为空,右子树不为空时
               if(node ->left == nullptr && node -> right != nullptr){
                 return 1 + rightHight;

               }
                //右子树为空,左子树不为空时,返回左子树高度
               if(node ->left != nullptr && node -> right == nullptr){
                  return  1 + leftHight;
               }
               //左右子树都不为空时,返回min()
             int result = 1 + min(leftHight,rightHight);
              return result;
     }




    int minDepth(TreeNode* root) {
       //依旧采取后序遍历,结果取高度的最小值
        return getHight(root);
    }
};

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

题目

给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。

完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。

示例 1:

输入:root = [1,2,3,4,5,6]
输出:6
示例 2:

题解

//递归法,递归遍历每个节点

/**
 * 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 traversal(TreeNode* node){
        if(node == nullptr)  return 0;
        int leftSum = traversal(node->left);
        int rightSum = traversal(node-> right);
        int result = 1 + leftSum + rightSum;
        return result;
    }
    int countNodes(TreeNode* root) {
         return traversal(root);
    }
};

//迭代法,利用层序遍历

/**
 * 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 countNodes(TreeNode* root) {
        //层序遍历每个节点,并计数
       queue<TreeNode*> que;
       if(root != nullptr) que.push(root);  //必须要对root是否为空进行判断
      int result = 0;
       while(!que.empty()){
           int size = que.size();
           for(int i = 0;i < size;i++){
                TreeNode* cur = que.front();
                que.pop();
                result++;
                if(cur->left) que.push(cur->left);
                if(cur->right) que.push(cur->right);
           }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值