2020-09-07

每日学习一个算法——好数对(同屋兄弟打呼噜震天响,半夜睡不着)

 


题目

给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。

你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。

示例 1:

输入: 
    Tree 1                     Tree 2                  
          1                         2                             
         / \                       / \                            
        3   2                     1   3                        
       /                           \   \                      
      5                             4   7                  
输出: 
合并后的树:
         3
        / \
       4   5
      / \   \ 
     5   4   7
注意: 合并必须从两个树的根节点开始。

通过次数69,841提交次数90,477

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-two-binary-trees


提示:以下是本篇文章正文内容,下面案例可供参考

一、解题思路

必须说实话,树的知识我都忘光了,也是从头开始学,先看看大佬的代码。

二、代码实现

就一遍

  public static TreeNode mergeTrees(TreeNode t1,TreeNode t2){
        //如果当前两个节点都为null,那么只能返回一个null
        if (t1 == null && t2 == null) return null;
        //如果当前节点为空,那么返回另一个不为空的节点值
        if (t1 == null) return t2;
        if (t2 == null) return t1;

        //如果当前两个节点都不为空,那么将其中一个节点1改为两个节点的值并重构树,并返回该节点
        //合并两个节点的值
        t1.val = t1.val + t2.val;

        //合并后根节点的左子树应该为两个树的左子树合并后的结果
        t1.left = mergeTrees(t1.left, t2.left);

        //合并后根节点的右子树应该为两个树的右子树合并后的结果
        t1.right = mergeTrees(t1.right,t2.right);

        //返回根节点
        return  t1;

说实话,我这个真的忘了,从头开始学吧,这个代码,我只是能看懂,也是借鉴的大佬的,就不多赘述了。

总结

学的算法简单的话,不难的话,学习还有什么意义?都会了还学他干嘛?所以还是慢慢啃硬骨头吧。

<think> 我们有一个需求:查询余额高于10000的所有用户的名字和余额。除了使用公共表达式(CTE)之外,我们还可以使用多种方法。 根据引用[1]中提到的银行用户表结构(假设表名为“银行用户表”,有“姓名”和“余额”字段),我们可以编写SQL语句。 常见的其他方法包括: 1. 直接使用SELECT语句的WHERE子句进行过滤。 2. 使用子查询(虽然公共表达式也是子查询的一种,但这里指其他形式的子查询,比如在FROM子句中的子查询)。 3. 使用视图(但视图并不是一次性的查询,这里我们主要讨论一次性的查询语句)。 4. 使用临时表(但同样,我们主要讨论查询语句,临时表需要创建和删除,不太适合作为单一查询)。 因此,最直接的方法就是使用简单的SELECT语句。 根据引用[2]和引用[3],我们可以写出基本的SELECT语句,注意引用[3]中使用了别名,引用[5]中使用了ORDER BY排序(虽然这里不需要排序,但我们可以选择是否排序)。 因此,我们可以这样写: 方法1:直接查询 ```sql SELECT 姓名, 余额 FROM 银行用户表 WHERE 余额 > 10000; ``` 但是,我们也可以使用子查询(虽然在这个简单需求中子查询没有必要,但为了展示多种写法): 方法2:使用FROM子句中的子查询 ```sql SELECT 姓名, 余额 FROM ( SELECT 姓名, 余额 FROM 银行用户表 ) AS 用户余额表 WHERE 余额 > 10000; ``` 方法3:我们还可以使用内联视图(实际上就是方法2)。 另外,如果我们需要对结果进行排序(例如按余额降序排列),可以加上ORDER BY子句(引用[5]): ```sql SELECT 姓名, 余额 FROM 银行用户表 WHERE 余额 > 10000 ORDER BY 余额 DESC; ``` 注意:引用[4]提到了索引的问题。如果我们在“余额”列上建立索引,那么查询效率会更高。否则,数据库可能进行全表扫描。 因此,除了公共表达式(CTE)之外,我们可以使用上述的直接查询或子查询的方式。其中,直接查询是最简单和高效的。 下面给出一个完整的例子(假设表名为`银行用户表`): ```sql -- 方法1:简单查询 SELECT 姓名, 余额 FROM 银行用户表 WHERE 余额 > 10000; -- 方法2:使用子查询(虽然在这里没有优势) SELECT 姓名, 余额 FROM ( SELECT 姓名, 余额 FROM 银行用户表 ) AS 子查询表 WHERE 余额 > 10000; -- 如果需要排序(降序) SELECT 姓名, 余额 FROM 银行用户表 WHERE 余额 > 10000 ORDER BY 余额 DESC; ``` 总结:对于这个需求,最简单的就是直接使用WHERE子句过滤。公共表达式(CTE)通常用于更复杂的查询,比如需要递归或多次引用同一个子查询结果集时。在简单查询中,直接查询即可。 注意:如果表名或字段名是英文的,那么应该使用英文,比如表名可能是`bank_account`,字段名为`name`和`balance`。但根据引用[1]中的表名和字段名,我们使用了中文。如果实际表结构是英文的,则需要修改。 另外,引用[2]提到,关键字和字段名不区分大小写,但数据严格区分大小写。不过在我们这个查询中,余额是数值,不存在大小写问题。 因此,根据用户需求,我们给出了不使用公共表达式的其他写法。 相关问题: 1. 如果余额字段包含小数,那么查询条件中是否需要考虑浮点数精度问题? 2. 当数据量很大时,如何优化这个查询? 3. 在银行系统中,查询账户余额时需要注意哪些事务隔离级别? </think>根据您的需求,我提供了三种不使用公共表达式(CTE)的SQL写法来查询余额高于10000的用户信息: ### 方法1:基础WHERE过滤(最简洁) ```sql SELECT 姓名, 余额 FROM 银行用户表 WHERE 余额 > 10000; ``` **说明**: 直接使用`WHERE`子句过滤条件,这是最高效的写法。当`余额`列有索引时,数据库会使用索引扫描(Index Scan),否则执行全表扫描(Table Scan)[^4]。 --- ### 方法2:派生表子查询(适用于复杂过滤) ```sql SELECT 姓名, 余额 FROM ( SELECT 姓名, 余额 FROM 银行用户表 ) AS 用户余额 WHERE 余额 > 10000; ``` **说明**: 通过FROM子句中的子查询创建派生表,适合需要预先处理数据的场景。注意使用`AS`为派生表命名是必须的[^2]。 --- ### 方法3:视图查询(可复用方案) ```sql -- 第一步:创建视图 CREATE VIEW 高余额用户视图 AS SELECT 姓名, 余额 FROM 银行用户表 WHERE 余额 > 10000; -- 第二步:查询视图 SELECT * FROM 高余额用户视图; ``` **说明**: 视图将查询逻辑持久化,适合需要多次使用的场景。查询视图时等同于执行视图定义的SQL语句[^2]。 --- ### 性能说明 1. **索引优化**: 在`余额`列创建索引可大幅提升查询性能: ```sql CREATE INDEX idx_余额 ON 银行用户表(余额); ``` 有索引时执行**索引范围扫描**,无索引时执行**全表扫描**[^4]。 2. **结果排序**: 如需按余额降序排列,添加: ```sql ORDER BY 余额 DESC; -- DESC表示降序[^5] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值