对称二叉树
一、题目
101. 对称二叉树
给你一个二叉树的根节点 root , 检查它是否轴对称。
示例 1:

输入:root = [1,2,2,3,4,4,3]
输出:true
示例 2:

输入:root = [1,2,2,null,3,null,3]
输出:false
提示:
- 树中节点数目在范围
[1, 1000] 内
-100 <= Node.val <= 100
进阶:你可以运用递归和迭代两种方法解决这个问题吗?
二、题解
题解一(翻转+判断)推荐
面试经典-翻转二叉树
面试经典-相同的树
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
class Solution { public static boolean isSymmetric(TreeNode root) { if (root == null) { return true; } if (root.left == null && root.right == null) { return true; } if (root.left == null || root.right == null) { return false; } TreeNode left = root.left; TreeNode right = root.right; TreeNode invertRoot = invertTree(right); return isSameTree(invertRoot, left); }
public static TreeNode invertTree(TreeNode root) { if (root == null) { return null; } TreeNode left = root.left; root.left = root.right; root.right = left; invertTree(root.left); invertTree(root.right); return root; }
public static boolean isSameTree(TreeNode p, TreeNode q) { if (p == null && q == null) { return true; } if (p == null || q == null) { return false; } if (p.val != q.val) { return false; } return isSameTree(p.left, q.left) && isSameTree(p.right, q.right); } }
|

题解二(判断 )推荐
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
class Solution { public static boolean isSymmetric(TreeNode root) { if (root == null) { return true; } if (root.left == null && root.right == null) { return true; } if (root.left == null || root.right == null) { return false; } return check(root.left, root.right); }
public static boolean check(TreeNode p, TreeNode q) { if (p == null && q == null) { return true; } if (p == null || q == null) { return false; } if (p.val != q.val) { return false; } return check(p.left, q.right) && check(p.right, q.left); } }
|

题解三(广度优先策略)不推荐
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
|
class Solution { public static boolean isSymmetric(TreeNode root) { if (root == null) { return true; } if (root.left == null && root.right == null) { return true; } if (root.left == null || root.right == null) { return false; } Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root.left); queue.offer(root.right); while (!queue.isEmpty()) { TreeNode leftNode = queue.poll(); TreeNode rightNode = queue.poll(); if (leftNode == null && rightNode == null) { continue; } if (leftNode == null || rightNode == null) { return false; } if (leftNode.val != rightNode.val) { return false; } queue.offer(leftNode.left); queue.offer(rightNode.right);
queue.offer(leftNode.right); queue.offer(rightNode.left); } return true; } }
|

三、总结
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
| import java.util.LinkedList; import java.util.Queue;
public class IsSymmetric {
public static void main(String[] args) { TreeNode root = new TreeNode(1); root.left = new TreeNode(2); root.right = new TreeNode(2); root.left.left = new TreeNode(3); root.left.right = new TreeNode(4); root.right.left = new TreeNode(4); System.out.println(isSymmetric(root)); }
public static boolean isSymmetricFromInvertAndCompare(TreeNode root) { if (root == null) { return true; } if (root.left == null && root.right == null) { return true; } if (root.left == null || root.right == null) { return false; } TreeNode left = root.left; TreeNode right = root.right; TreeNode invertRoot = invertTree(right); return isSameTree(invertRoot, left); }
public static TreeNode invertTree(TreeNode root) { if (root == null) { return null; } TreeNode left = root.left; root.left = root.right; root.right = left; invertTree(root.left); invertTree(root.right); return root; }
public static boolean isSameTree(TreeNode p, TreeNode q) { if (p == null && q == null) { return true; } if (p == null || q == null) { return false; } if (p.val != q.val) { return false; } return isSameTree(p.left, q.left) && isSameTree(p.right, q.right); }
public static boolean isSymmetricFromCompare(TreeNode root) { if (root == null) { return true; } if (root.left == null && root.right == null) { return true; } if (root.left == null || root.right == null) { return false; } return check(root.left, root.right); }
public static boolean check(TreeNode p, TreeNode q) { if (p == null && q == null) { return true; } if (p == null || q == null) { return false; } if (p.val != q.val) { return false; } return check(p.left, q.right) && check(p.right, q.left); }
public static boolean isSymmetric(TreeNode root) { if (root == null) { return true; } if (root.left == null && root.right == null) { return true; } if (root.left == null || root.right == null) { return false; } Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root.left); queue.offer(root.right); while (!queue.isEmpty()) { TreeNode leftNode = queue.poll(); TreeNode rightNode = queue.poll(); if (leftNode == null && rightNode == null) { continue; } if (leftNode == null || rightNode == null) { return false; } if (leftNode.val != rightNode.val) { return false; } queue.offer(leftNode.left); queue.offer(rightNode.right);
queue.offer(leftNode.right); queue.offer(rightNode.left); } return true; } }
|