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;
    
        }
    }
  • 相关阅读:
    堆(heap)和栈(stack)的区别
    STL容器学习总结
    从瀑布模型、极限编程到敏捷开发
    智力题
    Trie树详解及其应用
    理解inode
    找出字符串中连续出现次数最多的子串
    Oracle数据库中大数据量查询优化问题分区表的操作方法
    “在解决方案中的一个或多个项目由于以下原因未能加载 项目文件或网站已移动或重新命名,或者不在您的计算机上” 的解决办法
    转:完全卸载Oracle方法
  • 原文地址:https://www.cnblogs.com/s648667069/p/13708241.html
Copyright © 2011-2022 走看看