例如: 下面这棵二叉树是对称的
下面这棵二叉树不对称。
数据范围:节点数满足
,节点上的值满足
要求:空间复杂度
,时间复杂度
备注:
你可以用递归和迭代两种方法解决这个问题
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); } }
boolean isSymmetrical(TreeNode pRoot) { if(pRoot==null){ return true; } return dfs(pRoot.left ,pRoot.right); } boolean dfs(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 dfs(left.left,right.right) && dfs(left.right ,right.left); }
boolean isSymmetrical(TreeNode pRoot) { if(pRoot ==null) return true; return my(pRoot.left, pRoot.right); } boolean my(TreeNode left, TreeNode right){ if(left ==null && right==null) return true; if(left ==null) return false; if(right ==null) return false; if(left.val != right.val) return false; return my(left.left,right.right) && my(left.right,right.left); }