二叉树的镜像这道题是每个节点的左右子树交换
如果一颗二叉树同此二叉树的镜像是同样的
思路一:层序遍历 【双指针:每一层进行两边往中间比较】
import java.util.*;
public class Solution {
boolean isSymmetrical(TreeNode pRoot) {
if(pRoot==null)
return true;
TreeNode emptyNode = new TreeNode(-1);//空节点也入队,赋值便于后面的比较
Queue<TreeNode> queue = new LinkedList<>();
queue.add(pRoot);
while(!queue.isEmpty())
{
int len = queue.size();
ArrayList<Integer> list = new ArrayList<>();
while(len>0)
{
TreeNode node=queue.poll();
if(!node.equals(emptyNode))//空节点的子节点无需入队
{
queue.add(node.left==null?emptyNode:node.left);
queue.add(node.right==null?emptyNode:node.right);
}
list.add(node.val);
len--;
}
if(!isEqual(list))//每一层都进行镜像比较,不满足则提前返回
return false;
}
return true;
}
//用于判断每一层是否为镜像
private boolean isEqual(ArrayList<Integer> list)
{
int i=0;
int j=list.size()-1;
while(i<j)
{
if(list.get(i++)!=list.get(j--))
return false;
}
return true;
}
}
时间O(N),每个节点遍历一次,每一层检查一次(每个节点)
空间O(N),队列
思路二:递归
代码只有几行,不容易理解
终止条件
返回值
递归公式
- 两节点为空 true
- 其中一节点为空 false
- 值不同 false
- 左节点的左子树,右节点的右子树 && 左节点的右子树,右节点的左子树
public class Solution {
boolean isSymmetrical(TreeNode pRoot) {
return isMirror(pRoot,pRoot);
}
boolean isMirror(TreeNode root1,TreeNode root2)
{
if(root1==null&&root2==null)
return true;
if(root1==null||root2==null)
return false;
if(root1.val!=root2.val)
return false;
return isMirror(root1.left,root2.right)&&isMirror(root1.right,root2.left);
}
}
时间O(N)节点遍历,空间O(N) 递归栈