题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
思路分析
此题同原 leetcode(101)Symmetric Tree
整体思路:将对称二叉树的检验转换为与镜像二叉树是否为相等树的问题
递归方法 比较对应左子树与右子树值
循环方法 层序遍历 比较
代码
方法一 递归
boolean isSymmetrical(TreeNode pRoot){
return isSymmetrical(pRoot, pRoot);
}
boolean isSymmetrical(TreeNode pRoot1,TreeNode pRoot2){
if (pRoot1==null && pRoot2==null) { //两节点都为空 即相等
return true; //构造递归条件
}
if (pRoot1==null || pRoot2==null) { //一节点为空 另一不为空 返回false
return false;
}
if (pRoot1.val == pRoot2.val) { //父节点相等 再比较“对称”的子节点值
return isSymmetrical(pRoot1.left,pRoot2.right) && isSymmetrical(pRoot1.right, pRoot2.left);
}
return false;
}
结果
方法二 循环
boolean isSymmetrical(TreeNode pRoot){
return isSymmetrical(pRoot, pRoot); //将对称二叉树的检验转换为与镜像二叉树是否为相等树的问题
}
boolean isSymmetrical(TreeNode pRoot1,TreeNode pRoot2){
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(pRoot1); //将两节点入队
queue.offer(pRoot2);
while (!queue.isEmpty()) {
TreeNode temp1 = queue.poll();
TreeNode temp2 = queue.poll();
if (temp1==null && temp2==null) {
continue; //两节点都为空 即相等
}
if (temp1==null || temp2==null || temp1.val!=temp2.val) {
return false; //不相等条件
}
queue.offer(temp1.left); //对称条件 左子树的左节点与右子树的右节点比较
queue.offer(temp2.right);
queue.offer(temp1.right); //左子树的右节点与右子树的左节点比较
queue.offer(temp2.left);
}
return true;
}
结果