细品迭代法之「合并两个二叉树」与「对称二叉树的判断」
101. 对称二叉树
class Solution{
public boolean isSymmetric(TreeNode root){
if(root == null)
return true;
Queue<TreeNode> que = new LinkedList<>();
que.add(root.left);
que.add(root.right);
while(!que.isEmpty()){
TreeNode left = que.poll();//peek
TreeNode right = que.poll();
// 先判断是否为空,都为空,说明相等,则continue
if(left == null && right == null)
continue;
// 如果一个为空一个不为空,则直接false,如果都不为空,进行val判断,不相等则false;
if(left == null || right == null || (left.val != right.val))
return false;
// 最后开启下一轮,存两边,存中间
que.add(left.left);
que.add(right.right);
que.add(left.right);
que.add(right.left);
}
return true;
}
}
617. 合并二叉树
class Solution {
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
// 如果一个为空就返回另一个,之所以不考虑都为空的情况,是因为一个为空,另一个无论是啥直接返回都没错
if(root1 == null)
return root2;
if(root2 == null)
return root1;
// 创建新队列
Queue<TreeNode> que = new LinkedList<>();
// 两个都不为空,同时放入left,right
//root1和root2的值尚未进行操作,仍然需要放入que中
que.add(root1);
que.add(root2);
// 进行while队列为空的判断
while(!que.isEmpty()){
// 弹出两个
TreeNode rootModle = que.poll();
TreeNode rootChange = que.poll();
//此时说明两棵树都不为空,值相加
rootModle.val = rootModle.val + rootChange.val;
// if左节点都不为空,存入que中
if(rootModle.left != null && rootChange.left != null){
que.add(rootModle.left);
que.add(rootChange.left);
}
// if右节点不为空,存入que中
if(rootModle.right != null && rootChange.right != null){
que.add(rootModle.right);
que.add(rootChange.right);
}
// if左节点的model为空,change赋值发给model
if(rootModle.left == null)
rootModle.left = rootChange.left;
// if有节点的model为空,change赋值发给model
if(rootModle.right == null)
rootModle.right = rootChange.right;
}
return root1;
}
};