理解题意:相同节点位置上,都有数据的话,节点值相加,只有一方有数据的话,把有数据的部分及相关子树保留下来。
考察操作两棵二叉树,二叉树的遍历。
一般有两种解决方式:
递归|迭代。
区别:
递归,重复方法调用,自己调自己,进方法的栈。
迭代的话,自己创建一个队列或者栈来维持状态。
递归调用比较深的话,会内存溢出,因为要存的相关状态太多了,所以用迭代比较好,自己创建一个栈来维护必需的信息即可。
没有很深的调用层次的话,两个差别不大。
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<TreeNode> 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)