leetcode227合并二叉树

一.题目描述

二.解决办法

1.递归

如果考虑递归,就需要知道递归的终止条件是什么?本题的终止条件是:

  • 当root1或者root2为空时,root1为空就返回root2,root2为空就返回root1
if(root1 == null)
    return root2;
if(root2 == null)
    return root1;
  • 确定了终止条件后,我的理解是进行一次进行一次合并二叉树的操作。
    class Solution {
        public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
            if(root1 == null)
                return root2;
            if(root2 == null)
                return root1;
            TreeNode root = new TreeNode(root1.val+root2.val);//节点的val值进行合并
            root.left = mergeTrees(root1.left,root2.left);//左子树进行合并
            root.right = mergeTrees(root1.right,root2.right);//右子树进行合并
            return root;
        }
    }

    2.层序遍历

        使用队列来模拟层序遍历,可以将两棵树的节点放入到队列中。

  • 不新建树
class Solution{
    public TreeNode mergeTrees(TreeNode root1,TreeNode root2){
        if(root1 == null)
            return root2;
        if(root2 == null)
            return root1;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root1);
        queue.offer(root2);
        while(!queue.isEmpty()){
            TreeNode node1 = queue.peek();
            queue.poll();
            TreeNode node2 = queue.peek();
            queue.poll();
            node1.val += node2.val;

            if(node1.left != null && node2.left != null){
                queue.offer(node1.left);
                queue.offer(node2.left);   
            }
            if(node1.right != null && node2.right != null){
                queue.offer(node1.right);
                queue.offer(node2.right);   
            }
            if(node1.left == null && node2.left != null){
                node1.left = node2.left;
            }
             if(node1.right == null && node2.right != null){
                node1.right = node2.right;
            }
        }
        return root1;    
    }
}
  • 新建树(蛮复杂的)

取三个队列容器,构建一个新的节点,将他输入到queue,通过队列弹出poll每次更新TreeNode,即node,node1,node2.从而左右子树都会更新 。

class Solution{
    public TreeNode mergeTrees(TreeNode root1,TreeNode root2){
        if(root1 == null)
            return root2;
        if(root2 == null)
            return root1;
        TreeNode merged = new TreeNode(root1.val+root2.val);
        Queue<TreeNode> queue = new LinkedList<>();
        Queue<TreeNode> queue1 = new LinkedList<>();
        Queue<TreeNode> queue2 = new LinkedList<>();
        queue.offer(merged);
        queue1.offer(root1);
        queue2.offer(root2);
        while(!queue1.isEmpty() && !queue2.isEmpty()){
           TreeNode node = queue.poll();
           TreeNode node1 = queue.poll();
           TreeNode node2 = queue.poll();
           TreeNode left1 = node1.left;
           TreeNode left2 = node2.left; 
           TreeNode rigth1 = node1.right;
           TreeNode right2 = node2.right;
           if(left1 != null || left2 != null){
               if(left1 != null && left2 != null){
                   TreeNode left = new TreeNode(left1.val + left2.val);
                   node.left = left;
                   queue.offer(left);
                   queue1.offer(left1);
                   queue2.offer(left2);
               }
               else if(left1 != null){
                   node.left = left1;
               }
               else if(left2 != null){
                   node.left = left2;
               }
           } 
           if(right1 != null || right2 != null){
               if(right1 != null && right2 != null){
                   TreeNode right = new TreeNode(right1.val + right2.val);
                   node.right = right;
                   queue.offer(right);
                   queue1.offer(right1);
                   queue2.offer(right2);
               }
               else if(right1 != null){
                   node.right = right1;
               }
               else if(right2 != null){
                   node.right = right2;
               }
           }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值