• [LeetCode] 617. Merge Two Binary Trees(合并两棵二叉树)


    Description

    Given two binary trees and imagine that when you put one of them to cover the other, some nodes of the two trees are overlapped while the others are not.

    给你两棵二叉树,想象一下,当你把其中一棵树置于另一棵树之上时,其中的一部分节点会互相覆盖,另外一些节点则不会。

    You need to merge them into a new binary tree. The merge rule is that if two nodes overlap, then sum node values up as the new value of the merged node. Otherwise, the NOT null node will be used as the node of new tree.

    你需要把这两棵二叉树合并为一棵新的二叉树。合并规则是:如果两个节点互相覆盖,取这两个节点值的和作为新节点的值;否则,取非空的节点的值作为新节点的值。

    Examples

    Example 1

    Input: 
        Tree 1                     Tree 2                  
              1                         2                             
             /                        /                             
            3   2                     1   3                        
           /                                                    
          5                             4   7                  
    Output: 
    Merged tree:
             3
            / 
           4   5
          /     
         5   4   7
    

    Note

    The merging process must start from the root nodes of both trees.

    合并过程都是从两节点的根开始的。

    Solution

    此题的解题思路来自于题目中对于合并规则的描述。按照合并规则的描述,可以很容易地写出合并根节点的代码,然后再通过对左右子树递归调用方法,来实现对左右子树的合并,最后完成此题。

    /**
     * Example:
     * var ti = TreeNode(5)
     * var v = ti.`val`
     * Definition for a binary tree node.
     * class TreeNode(var `val`: Int) {
     *     var left: TreeNode? = null
     *     var right: TreeNode? = null
     * }
     */
    class Solution {
        fun mergeTrees(t1: TreeNode?, t2: TreeNode?): TreeNode? {
            // 对空树的处理:一个为空就返回另一个
            if (t1 == null) {
                return t2
            }
            if (t2 == null) {
                return t1
            }
            // 两个均为非空,则先将树根的值进行合并
            val newNode = TreeNode(t1.`val` + t2.`val`)
            // 然后依次对左子树和右子树以相同的方式处理
            newNode.left = mergeTrees(t1.left, t2.left)
            newNode.right = mergeTrees(t1.right, t2.right)
            return newNode
        }
    }
    

    上面的代码虽然能够解决问题,但就我个人认为,这个解法不应该对原先传入的树造成影响。上面的代码会存在一种情况:新的节点的 leftright 指针可能会指向原树中的某一个节点。利用 Kotlin 的语法特性,可以得到本题的另一种写法,虽然未经测试,但目测来看应该解决了这一问题:

    /**
     * Example:
     * var ti = TreeNode(5)
     * var v = ti.`val`
     * Definition for a binary tree node.
     * class TreeNode(var `val`: Int) {
     *     var left: TreeNode? = null
     *     var right: TreeNode? = null
     * }
     */
    class Solution {
        fun mergeTrees(t1: TreeNode?, t2: TreeNode?): TreeNode? {
            // 对两棵树均为空树的特判
            if (t1 == null && t2 == null) {
                return null
            }
            // 思路与刚才相同,但利用 Kotlin 的语法糖少写一些 if 判断
            val lVal = t1?.`val`?:0
            val rVal = t2?.`val`?:0
            val newRoot = TreeNode(lVal + rVal)
            newRoot.left = mergeTrees(t1?.left, t2?.left)
            newRoot.right = mergeTrees(t1?.right, t2?.right)
            return newRoot
        }
    }
    
  • 相关阅读:
    django集成django-xadmin
    Django设置 DEBUG=False后静态文件无法加载解决
    Django ORM必会的查询方法
    django admin-过滤器
    Django settings.py 中设置访问 MySQL 数据库【一种是直接在 settings.py 文件中直接写数据库信息,另一种是读文件获取数据库信息】
    django-admin之ModelAdmin最全解释
    SPL(Standard PHP Library 标准PHP类库)
    rsync 数据同步
    PHP 安装memcache.so 和memcached.so
    linux 安装memcached
  • 原文地址:https://www.cnblogs.com/zhongju/p/13770174.html
Copyright © 2020-2023  润新知