力扣刷题--入门20题--2024.3.19

3.最小偶倍数

给你一个正整数 n ,返回 2 n 的最小公倍数(正整数)。

我的代码:

class Solution {
public:
    int smallestEvenMultiple(int n) {
      if (n%2==0){
      return n;
      }
      else{
      return 2*n;
      }
    }
};

官方解法,注意这里的简便表示-直接用return附判断语句

class Solution {
public:
    int smallestEvenMultiple(int n) {
      return(n%2==0)?n:n*2;
    }
};

拓展解法:二进制位运算 当n是偶数时,输出n;当n是奇数时,输出左移一位(101--1010)

class Solution {

public:

    int smallestEvenMultiple(int n) {

        return n << (n & 1);

    }

};

作者:灵茶山艾府
链接:https://leetcode.cn/problems/smallest-even-multiple/solutions/1831561/yi-xing-gong-shi-by-endlesscheng-ixss/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

这段代码执行了两个操作,我们可以将其拆分为两部分来理解。

  1. n & 1:
    这是一个位运算操作,称为按位与(bitwise AND)。1在二进制中表示为0001(假设n是一个较小的整数,以便我们可以直观地看到这一点;实际上,1的二进制表示取决于n的位数)。这个操作检查n的最低位(也就是最右边的位)是0还是1

                                  如果n的最低位是0,则n & 1的结果是0
                                  如果n的最低位是1,则n & 1的结果是1
      2. n << ...:
          这是一个位运算操作,称为左移(bitwise left shift)。它将n的二进制表示向左移动指定的位数。例如,如果n0010(即十进制的2),并且我们将其左移1位,那么结果将是0100(即十进制的4)。

现在,将这两部分结合起来:

return n << (n & 1);

这行代码首先检查n的最低位。如果最低位是0,则n & 1的结果是0,所以n不会被移动(即左移0位)。如果最低位是1,则n & 1的结果是1,所以n会被左移1位。

附带链接:位运算的技巧https://www.cnblogs.com/sjsjsj-minus-Si/p/11634715.html

 4.判断根节点是否等于子节点之和

You are given the root of a binary tree that consists of exactly 3 nodes: the root, its left child, and its right child.

Return true if the value of the root is equal to the sum of the values of its two children, or false otherwise.

我的代码(错误)

/**
 * 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:
    bool checkTree(TreeNode* root) {
        return(x==left+right)? 'true':'false';
    }
};

首先,checkTree函数接收一个指向TreeNode类型的指针root,该指针指向二叉树的根节点。然后,它试图返回一个布尔值(truefalse),表示二叉树是否满足某种条件。

下面是TreeNode结构体的详细解释:

  1. 成员变量

    • int val;:这是节点中存储的值,类型为整数。
    • TreeNode *left;:这是一个指向左子节点的指针。如果节点没有左子节点,这个指针将被设置为nullptr。类型为Treenode(意味着它也包含了所有的成员)
    • TreeNode *right;:这是一个指向右子节点的指针。如果节点没有右子节点,这个指针也将被设置为nullptr。类型为Treenode
  2. 构造函数

    • TreeNode() : val(0), left(nullptr), right(nullptr) {}TreeNode的默认构造函数。当你创建一个新的TreeNode对象而没有提供任何参数时,它将使用这个构造函数。这个构造函数将节点的值设置为0,并将左右子节点的指针都设置为nullptr
    • TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}:这是一个带一个参数的构造函数。当你创建一个新的TreeNode对象并只提供一个整数参数时,它将使用这个构造函数。这个构造函数将节点的值设置为提供的整数x,并将左右子节点的指针都设置为nullptr
    • TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}:这是一个带三个参数的构造函数。当你创建一个新的TreeNode对象并提供一个整数和两个TreeNode指针作为参数时,它将使用这个构造函数。这个构造函数将节点的值设置为提供的整数x,并将左子节点的指针设置为提供的left指针,将右子节点的指针设置为提供的right指针。

 官方答案:

class Solution {
public:
    bool checkTree(TreeNode* root) {
        return root->val == root->left->val + root->right->val;//root指向val,指针left,指针right
    }
};

 拓展答案: 支线任务GET!!通过这里深刻理解二叉树和递归

现在把题目扩展一下:假设输入的是一棵完全二叉树(每个

节点都有 000 或 222 个儿子),树上有 nnn 个节点(n≥3n\ge 3n≥3)。要求判断除了叶子节点,是否每个节点的值都等于其左右儿子的节点值之和。

这可以用递归解决,请看 深入理解递归【基础算法精讲 09】看到递归就晕?带你理解递归的本质!_哔哩哔哩_bilibili,思路如下:

    如果当前节点是叶子节点,直接返回 true,表示无需判断叶子。
    否则,如果当前节点的节点值不等于其儿子的节点值之和,返回 false。
    否则,递归左右儿子,如果它们都返回 true,那么当前节点返回 true,否则返回 false。

class Solution {

public:

    bool checkTree(TreeNode *root) {

        if (root->left == root->right) // 递归边界:判断 root 是否为叶子节点

            return true;

        return root->val == root->left->val + root->right->val &&

               checkTree(root->left) && checkTree(root->right);
//体会这里的递归嵌套,先在上面的递归程序里写明了递归的边界,最后的输出在重复利用这个递归
//判断此节点是不是子节点(叶子节点的左右指针都是nullptr)

    }

};

递归类问题的核心:思考母问题和子问题的思路相同部分

本题目思路重复部分是判断节点是不是叶子节点,递归边界是此节点是叶子节点(特征就是节点的左右指针相等,当节点是叶子节点时,左右nullptr相等;而那种两边相等的节点不在判断是否是叶子节点这个问题之内

拓展练习4.1 same tree

. - 力扣(LeetCode)如何灵活运用递归?【基础算法精讲 10】_哔哩哔哩_bilibili

Given the roots of two binary trees p and q, write a function to check if they are the same or not.

Two binary trees are considered the same if they are structurally identical, and the nodes have the same value. 这里的递归重复思路就是节点与节点之间的比较,递归边界是其中一指针为null,即有一树是空的(说明二叉树结构肯定不同)

class Solution {
public:
    bool isSameTree(TreeNode* p, TreeNode* q) {
        if (p==nullptr||q==nullptr)
        return p==q;//p和q都为空才可以返回true,用p==q表达这个意思
        return p->val == q->val && isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);

    }
};

4.2 symmstric tree

. - 力扣(LeetCode)

递归重复:左树和右树对称  递归边界:二叉树结构不同(有一树为空)

class Solution {
    bool isSameTree(TreeNode* p,TreeNode*q){
        if(p == nullptr || q == nullptr)
            return p == q;
        return p->val == q->val && isSameTree(p->left,q->right) && isSameTree(p->right,q->left);
    }
public:
    bool isSymmetric(TreeNode* root) {
        return isSameTree (root->left,root->right);
    }
};

4.3 Balanced binary tree

. - 力扣(LeetCode)
Given a binary tree, determine if it is height-balanced
.这里递归程序中,数据栈式存储还需多理解一下

class Solution {
    int get_height(TreeNode*node){
        if (node == nullptr)
            return 0;
        int leftH = get_height(node->left);
        if (leftH == -1)
            return -1;
        int rightH = get_height(node->right);
        if (rightH == -1 || abs(leftH-rightH)>1)
            return -1;
        return max(leftH,rightH)+1;
    }
public:
    bool isBalanced(TreeNode* root) {
        return get_height(root)!=-1; //返回-1说明根节点不平衡
        }

    
};

 

  • 51
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值