例如: 下面这棵二叉树是对称的
下面这棵二叉树不对称。
数据范围:节点数满足
,节点上的值满足
要求:空间复杂度
,时间复杂度
备注:
你可以用递归和迭代两种方法解决这个问题
递归和迭代方法实现:
递归方法:
public boolean isSymmetrical (TreeNode pRoot) {
// write code here
if (pRoot == null){
return true;
}
return compareTree(pRoot.left,pRoot.right);
}
private boolean compareTree(TreeNode left, TreeNode right) {
if (left == null && right == null){
return true;
}
if (left == null || right == null){
return false;
}
if (left.val != right.val){
return false;
}
return compareTree(left.left,right.right) &&compareTree(left.right,right.left);
}
迭代方法实现
public boolean isSymmetrical2 (TreeNode pRoot) {
// write code here
if (pRoot == null){
return true;
}
Stack<TreeNode> stackLeft = new Stack<>();
Stack<TreeNode> stackRight = new Stack<>();
stackLeft.push(pRoot.left);
stackRight.push(pRoot.right);
while (!stackLeft.isEmpty() && !stackRight.isEmpty()){
TreeNode left = stackLeft.pop();
TreeNode right = stackRight.pop();
if (left == null && right == null){
continue;
}
if (left == null || right == null){
return false;
}
if (left.val != right.val){
return false;
}
stackLeft.push(left.right);
stackLeft.push(left.left);
stackRight.push(right.left);
stackRight.push(right.right);
}
return true;
} import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pRoot TreeNode类
* @return bool布尔型
*/
public boolean isSymmetrical (TreeNode pRoot) {
// write code here
LinkedList<TreeNode> queue = new LinkedList<>();
// 根节点为空或者只有一个根节点返回true
if (pRoot == null || pRoot != null && pRoot.left == null &&
pRoot.right == null ) {
return true;
}
if (pRoot != null) {
boolean pl = this.exists(pRoot.left);
boolean pr = this.exists(pRoot.right);
if (pl && pr && pRoot.left.val == pRoot.right.val) {
queue.push(pRoot.left);
queue.push(pRoot.right);
} else {
return false;
}
}
TreeNode left;
TreeNode right;
while (!queue.isEmpty()) {
left = queue.poll();
right = queue.poll();
boolean ll = this.exists(left.left);
boolean lr = this.exists(left.right);
boolean rl = this.exists(right.left);
boolean rr = this.exists(right.right);
if (ll && rr || !ll && !rr) {
if (ll) {
if (left.left.val == right.right.val) {
queue.add(left.left);
queue.add(right.right);
} else {
return false;
}
}
} else {
return false;
}
if ( lr && rl || !lr && !rl) {
if (lr ) {
if (left.right.val == right.left.val) {
queue.add(left.right);
queue.add(right.left);
} else {
return false;
}
}
} else {
return false;
}
}
return true;
}
private boolean exists(TreeNode node) {
return node != null;
}
} public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pRoot TreeNode类
* @return bool布尔型
*/
boolean b=true;
public boolean isSymmetrical (TreeNode pRoot) {
// write code here
if(pRoot==null)
return true;
a(pRoot.left,pRoot.right);
return b;
}
public void a(TreeNode left,TreeNode right){
if(left==null&&right==null)
return;
if(left==null||right==null){
b=false;
return;
}
if(left.val!=right.val){
b=false;
return;
}
a(left.left,right.right);
a(left.right,right.left);
}
} //思路:对称及子树的左子树等于子树的右子树
public boolean isSame(TreeNode r1,TreeNode r2) {
if(r1==null&&r2==null) {
return true;
}
if(r1==null||r2==null) {
return false;
}
if(r1.val!=r2.val) {
return false;
}
//让r1的左与r2的右进行比较,r1的右与r2的左进行比较
return isSame(r1.left,r2.right)&&isSame(r1.right,r2.left);
}
public boolean isSymmetrical (TreeNode pRoot) {
if(pRoot==null) {
return true;
}
return isSame(pRoot.left,pRoot.right);
} public boolean isSymmetrical (TreeNode pRoot) {
if(pRoot==null) return true;
boolean ans=build(pRoot.left,pRoot.right);
return ans;
}
public boolean build(TreeNode left,TreeNode right){
if(left==null&&right==null) return true;
if(left==null&&right!=null) return false;
if(left!=null&&right==null) return false;
if(left.val!=right.val) return false;
boolean leftB=build(left.left,right.right);
boolean rightB=build(left.right,right.left);
return leftB&&rightB;
} import java.util.*;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
boolean isSymmetrical(TreeNode pRoot) {
if (pRoot == null) {
return true;
}
return isSymmetrical(pRoot.left, pRoot.right);
}
private boolean isSymmetrical(TreeNode left, TreeNode right) {
if (left == null) {
return right == null;
}
if (right == null) {
return false;
}
if (left.val != right.val) {
return false;
}
return isSymmetrical(left.left, right.right) &&
isSymmetrical(left.right, right.left);
}
}
public class Solution {
boolean isSymmetrical(TreeNode pRoot) {
// 非空验证
if(pRoot == null) return true;
// 开始递归查找
return isSymmetrical1(pRoot.left, pRoot.right);
}
boolean isSymmetrical1(TreeNode left, TreeNode right) {
// 左,右都为null则返回true
if(left == null && right == null) return true;
// 只有一个为null,就返回false
else if(left == null || right == null) return false;
// 两个值 不相等 则返回false
else if(left.val != right.val) return false;
// 运行到此,说明当前两个节点的值相等
// 下面分别左右递归 查找子节点是否相等,必须左右都返回true,否则false
return isSymmetrical1(left.left, right.right) && isSymmetrical1(left.right, right.left);
}
} /*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
boolean isSymmetrical(TreeNode pRoot) {
if (pRoot == null || (pRoot.left == null && pRoot.right == null))
return true;
if (pRoot != null && (pRoot.left == null || pRoot.right == null))
return false;
if (pRoot.left.val != pRoot.right.val) {
return false;
} else {
return help(pRoot.left, pRoot.right);
}
}
boolean help(TreeNode left, TreeNode right) {
if (left == null && right == null)
return true;
if (left == null || right == null)
return false;
if (left.val == right.val)
return help(left.left, right.right) && help(left.right, right.left);
return false;
}
}
public class Solution {
boolean isSymmetrical(TreeNode root) {
if(root == null) return true;
return dfs(root.left, root.right);
}
boolean dfs(TreeNode root1, TreeNode root2){
if(root1== null && root2 == null) return true;
if(root1 == null || root2 == null) return false;
return root1.val == root2.val && dfs(root1.left, root2.right) && dfs(root1.right, root2.left);
}
} import java.util.*;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
boolean isSymmetrical(TreeNode pRoot) {
if (pRoot == null) return true;
return judge(pRoot.left, pRoot.right);
}
public boolean judge(TreeNode left, TreeNode right) {
if (left == null && right == null) return true;
if (left == null || right == null || left.val != right.val) return false;
return judge(left.left, right.right) && judge(left.right, right.left);
}
}
/*思路:首先根节点以及其左右子树,左子树的左子树和右子树的右子树相同 * 左子树的右子树和右子树的左子树相同即可,采用递归 * 非递归也可,采用栈或队列存取各级子树根节点 */ public class Solution { boolean isSymmetrical(TreeNode pRoot) { if(pRoot == null){ return true; } return comRoot(pRoot.left, pRoot.right); } private boolean comRoot(TreeNode left, TreeNode right) { // TODO Auto-generated method stub if(left == null) return right==null; if(right == null) return false; if(left.val != right.val) return false; return comRoot(left.right, right.left) && comRoot(left.left, right.right); } }