zoukankan      html  css  js  c++  java
  • 翻转二叉树、合并二叉树(力扣第226、617题)

    题目

    翻转一棵二叉树。

    示例:

    输入:

         4
       /   
      2     7
     /    / 
    1   3 6   9

    输出:

         4
       /   
      7     2
     /    / 
    9   6 3   1

    分析:

      翻转二叉树,核心就是交换左右子树,子树也有子树。这就是逻辑上的重复,所以采用递归的方式解决。

    代码:

        public TreeNode invertTree(TreeNode root) {
            if (root == null || (root.left == null && root.right == null)){
                return root;
            }
    
            TreeNode left = invertTree(root.left);
            TreeNode right = invertTree(root.right);
    
            root.left = right;
            root.right = left;
            return root;
        }

    题目

      给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。

      注意,合并必须从两个树的根节点开始。

    示例:

    输入: 
        Tree 1                     Tree 2                  
              1                         2                             
             /                        /                             
            3   2                     1   3                        
           /                                                    
          5                             4   7                  
    输出: 
    合并后的树:
             3
            / 
           4   5
          /     
         5   4   7

    分析:

      因为是合并,所以遍历二叉树的时候必须是对两棵树的同步遍历,即同时访问相同位置的结点。那么就访问的时候就可能出现不同的情况,题目中也说了,如果是节点重叠那么就将两棵树的对应节点值相加作为合并后的新值,否则不为null的节点直接作为新二叉树的节点,那么我们来具体的分析可能的情况,从根节点开始同步访问:

      1、两个节点都存在,节点值相加,然后作为新节点的值

      2、两个节点都不存在,直接返回null

      3、只有一个节点存在,那么就直接返回不为null的节点

      合并包括根节点的合并以及左右子树的对应合并,所以用递归的方式可以很好的解决。

    代码:

        public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
    
            if (t1 == null && t2 == null){
                return null;
            }
    
            if (t1 == null || t2 == null){
    
                return t1 == null ? t2 : t1;
            }
            TreeNode root = new TreeNode(t1.val+t2.val);
            TreeNode left = mergeTrees(t1.left,t2.left);
            TreeNode right = mergeTrees(t1.right,t2.right);
            root.left = left;
            root.right = right;
    
            return root;
        }
  • 相关阅读:
    移动应用专项测试
    MAC连接安卓手机通过adb指令安装apk
    Git GUI可视化操作教程
    nestjs中typeorm进行事物操作
    vue-element-admin 实现动态路由(从后台查询出菜单列表绑定侧边栏)
    el-form 表单校验
    vscode设置VUE eslint开发环境
    .netcore signalR 实时消息推送
    psexec局域网执行远程命令
    Asp.Net跨平台 Jexus 5.8.1 独立版
  • 原文地址:https://www.cnblogs.com/yxym2016/p/13492542.html
Copyright © 2011-2022 走看看