zoukankan      html  css  js  c++  java
  • 每天1题算法题(4)-合并二叉树 (√)

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

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

    示例 1:

     解答

    最简单也是最直接的,利用BFS递归实现

    class Solution {
        public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
            if(t1 == null && t2 == null) {
                return null;
            }
            TreeNode treeNode = new TreeNode();
            if(t1 != null && t2 != null) {
                treeNode.val = t1.val + t2.val;
                treeNode.left = mergeTrees(t1.left, t2.left);
                treeNode.right = mergeTrees(t1.right, t2.right);
            }
            if(t1 != null && t2 == null) {
                treeNode.val = t1.val;
                treeNode.left = mergeTrees(t1.left, null);
                treeNode.right = mergeTrees(t1.right, null);
            }
            if(t1 == null && t2 != null) {
                treeNode.val = t2.val;
                treeNode.left = mergeTrees(null, t2.left);
                treeNode.right = mergeTrees(null, t2.right);
            }
            return treeNode;
        }
    }

     官方简答

    核心关键 

    如果两棵树的当前节点均不为空,我们就将它们的值进行相加,并对它们的左孩子和右孩子进行递归合并;如果其中有一棵树为空,那么我们返回另一颗树作为结果;

    public class Solution {
        public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
            if (t1 == null)
                return t2;
            if (t2 == null)
                return t1;
            t1.val += t2.val;
            t1.left = mergeTrees(t1.left, t2.left);
            t1.right = mergeTrees(t1.right, t2.right);
            return t1;
        }
    }

    进阶

    利用迭代实现

    class Solution {
        public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
            // 如果左树为空,直接返回右树
            if(t1 == null) {
                return t2;
            }
           Stack<TreeNode[]> stack = new Stack();
           stack.push(new TreeNode[]{t1,t2});
           while(stack.size() > 0) {
               TreeNode[] treeNodes = stack.pop();
               TreeNode tmpt1 = treeNodes[0];
               TreeNode tmpt2 = treeNodes[1];
               // 如果左数或右数为空,不需要合并,直接走下一个
                if(tmpt1 == null || tmpt2 == null) {
                    continue;
                }
                // 合并
                tmpt1.val += tmpt2.val;
                // 如果左树的左分支为空,则返回右树的左分支
                if(tmpt1.left == null) {
                    tmpt1.left = tmpt2.left;
                } else {
                    // 否则将左树左分支和右树左分支加入处理
                    stack.push(new TreeNode[]{tmpt1.left,tmpt2.left});
                }
                // 如果左树的右分支为空,则返回右树的右分支
                if(tmpt1.right == null) {
                    tmpt1.right = tmpt2.right;
                } else {
                    // 否则将左树右分支和右树右分支加入处理
                    stack.push(new TreeNode[]{tmpt1.right,tmpt2.right});
                }
           }
           // 返回合并后的树
           return t1;
    
        }
    }
  • 相关阅读:
    ES各种错误解决
    ES 父子文档查询
    logstash jdbc 各种数据库配置
    ruby 疑难点之—— attr_accessor attr_reader attr_writer
    ruby 疑难点之—— yield 和 yield self
    aggregation 详解2(metrics aggregations)
    logstash multiline 把文件处理为单个 event
    aggregation 详解4(pipeline aggregations)
    aggregation 详解3(bucket aggregation)
    C++内存字节对齐规则
  • 原文地址:https://www.cnblogs.com/s648667069/p/13708241.html
Copyright © 2011-2022 走看看