Leetcode617合并二叉树

理解题意:相同节点位置上,都有数据的话,节点值相加,只有一方有数据的话,把有数据的部分及相关子树保留下来。

考察操作两棵二叉树,二叉树的遍历。

一般有两种解决方式:

        递归|迭代。

区别:

        递归,重复方法调用,自己调自己,进方法的栈。

        迭代的话,自己创建一个队列或者栈来维持状态。

        递归调用比较深的话,会内存溢出,因为要存的相关状态太多了,所以用迭代比较好,自己创建一个栈来维护必需的信息即可。

        没有很深的调用层次的话,两个差别不大。

1.递归 

public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
        if(Objects.isNull(root1)) return root2;
        if(Objects.isNull(root2)) return root1;
        //前序处理:结果由root1返回,不额外创建节点
        //其他遍历顺序,调整对应顺序即可,没啥限制
        //中间处理
        root1.val+=root2.val;
        //左子树处理
        root1.left=mergeTrees(root1.left,root2.left);
        //右子树处理
        root1.right=mergeTrees(root1.right,root2.right);
        return root1;
    }

2.迭代

public TreeNode mergeTrees2(TreeNode root1, TreeNode root2) {
        if(Objects.isNull(root1)) return root2;
        if(Objects.isNull(root2)) return root1;
        //自定义栈,保存要处理的节点,处理后pop弹出,处理完时,栈空
        Stack stack=new Stack<>();
        //这个入栈顺序是因为栈先进后出
        stack.push(root2);
        stack.push(root1);
        while(!stack.isEmpty()) {
            TreeNode node1=stack.pop();
            TreeNode node2=stack.pop();
            //根节点处理
            node1.val+= node2.val;
            //非空节点入栈
            if(node1.left!=null&&node2.left!=null){
                stack.push(node2.left);
                stack.push(node1.left);
            }
            if(node1.right!=null&&node2.right!=null){
                stack.push(node2.right);
                stack.push(node1.right);
            }
            //结果由root1返回,root1缺失的部分,root2补全
            if(node1.left==null&&node2.left!=null){
                node1.left=node2.left;
            }
            if(node1.right==null&&node2.right!=null){
                node1.right=node2.right;
            }
        }
        return root1;
    }

优化的余地

            //非空节点入栈
            if(node1.left!=null&&node2.left!=null){
                stack.push(node2.left);
                stack.push(node1.left);
            }
            if(node1.right!=null&&node2.right!=null){
                stack.push(node2.right);
                stack.push(node1.right);
            }
            //结果由root1返回,root1缺失的部分,root2补全
            if(node1.left==null&&node2.left!=null){
                node1.left=node2.left;
            }
            if(node1.right==null&&node2.right!=null){
                node1.right=node2.right;
            }


-------------------------分界线--------------------------------------

            //非空节点入栈
            if(node1.left!=null&&node2.left!=null){
                stack.push(node2.left);
                stack.push(node1.left);
            }else if(node1.left==null){ //结果由root1返回,root1缺失的部分,root2补全
                node1.left=node2.left;
            }
            if(node1.right!=null&&node2.right!=null){
                stack.push(node2.right);
                stack.push(node1.right);
            }else if(node1.right==null){
                node1.right=node2.right;
            }

3.时间复杂度分析

1.递归

        时间复杂度:O(n)

        空间复杂度:O(1)

2.迭代

        时间复杂度:O(n)

        空间复杂度:O(n)

你可能感兴趣的:(刷题训练营,算法,java)