二叉树练习day.3

104.二叉树的最大深度

链接:. - 力扣(LeetCode)

题目描述:

给定一个二叉树 root ,返回其最大深度。

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

示例 1:

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

示例 2:

输入:root = [1,null,2]
输出:2

提示:

  • 树中节点的数量在 [0, 104] 区间内。
  • -100 <= Node.val <= 100

注意二叉树的深度和高度的区别

二叉树的深度:二叉树中任意一个结点到根节点的距离(前序遍历)

二叉树的高度:二叉树中任意一个结点到叶子节点的距离(后序遍历)

根节点的高度是二叉树的最大深度

思路实现:

通过根节点高度(根节点的高度使用后序遍历)来求出二叉树的最大深度,使用递归实现

1.确定函数的参数和返回值,参数应该是二叉树的根节点,返回值应该是其高度

2.确定终止条件,此时终止条件应该为当前的节点为空

3.确定单层递归逻辑,先计算左节点的高度并返回,计算右节点的高度并返回

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
int maxDepth(struct TreeNode* root) {
    if(root == NULL)
        return 0;
    int a = maxDepth(root->left); //左
    int b = maxDepth(root->right);//右

    return a>b?a+1:b+1; //中
}

111.二叉树的最小深度

链接:. - 力扣(LeetCode)

题目描述:

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

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

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

示例 1:

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

示例 2:

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

提示:

  • 树中节点数的范围在 [0, 105]
  • -1000 <= Node.val <= 1000

实现思路

与上题一样,可以使用后序遍历,通过求最小的高度,来求解最小的深度,因为题目要求的最小深度是从根节点到最近叶子节点的最短路径上的节点数量

1.确定函数参数和返回值,函数返回值为高度,参数为根节点

2.确定递归的终止条件,即遇到空节点则返回0

3.确定递归的逻辑,向左遍历,找到左子树的最小高度,向右遍历,取得右子树的最小高度,注意判断不是叶子节点的情况,即根节点的左右节点有一个为空的情况

代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
int minDepth(struct TreeNode* root) {
    if(root == NULL)
        return 0;
    
    int a = minDepth(root->left);
    int b = minDepth(root->right);

    if(root->left == NULL && root->right != NULL)
        return 1 + b;
    if(root->left && !root-> right)
        return 1 + a;

    return a<b?a+1:b+1; 
}

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

链接:. - 力扣(LeetCode)

题目描述:

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

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

示例 1:

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

示例 2:

输入:root = []
输出:0

示例 3:

输入:root = [1]
输出:1

提示:

  • 树中节点的数目范围是[0, 5 * 104]
  • 0 <= Node.val <= 5 * 104
  • 题目数据保证输入的树是 完全二叉树

思路:

不将其作为一颗普通的二叉树,而是将其作为一颗完全二叉树,利用完全二叉树的特性,来对其节点的数量进行计算

我们可以对完全二叉树的子树进行判断,如果该二叉树的左右子树又都是满二叉树,那么可以根据公式2^n-1计算出左右子树的节点数,最后加上根节点,就可以计算得出该完全二叉树的节点数量,n为二叉树的深度,如果左右不是满二叉树,则继续向下遍历,总有满足满二叉树的节点,例如一个叶子节点也是满二叉树,将其返回给上一个节点

判断子树是不是满二叉树

递归遍历子树的左侧和右侧,判断其深度是否相等,如果相等则代表该二叉树就为满二叉树,因为题目保证输出的是完全二叉树

递归实现

1.判断函数的参数和返回值,参数为二叉树的根节点,返回值为节点数

2.判断终止条件,如果节点为空,则返回0,如果为满二叉树,返回节点数

3.判断递归逻辑,遍历左右子树数量,返回左右子树数量+1

代码实现

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
int countNodes(struct TreeNode* root) {

    if(root == NULL)
        return 0;

    struct TreeNode *left = root->left;
    struct TreeNode *right = root->right;
    int leftdep = 0, rightdep = 0;
    while(left)
    {
        left = left->left;
        leftdep++;
    }
    while(right)
    {
        right = right->right;
        rightdep++;
    }
    if(leftdep == rightdep)
        return (2<<leftdep) - 1;


    int lnum = 0, rnum = 0;
    lnum = countNodes(root->left);
    rnum = countNodes(root->right);
    return lnum + rnum + 1;
}

注:

本题也可以使用直接遍历的方法遍历所有节点计算出结果,但是使用完全二叉树的性质不需要遍历全部的结点,虽然时间复杂度都为O(n),但是使用性质计算更优

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值