给你一个二叉树的根节点 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
| /** * 确立条件,既然是判断是否对称,因此需要两个比较的节点 ,定义 l,那么比较之后的结果是什么,当时就是返回值 * <p> * 这里不要管 l,r是那棵树,那个节点,方正就是需正确比较是否对称的节点树,不然很容易绕进去 */ public static boolean order(TreeNode l, TreeNode r) { if (l == null && r == null) {//l、r都是空,对称 return true; } else if (l != null && r == null) {//l,不空,r空,不对称 return false; } else if (l == null && r != null) {//l,空,r不空,不对称 return false; } else if (l.val != r.val) {//l,r都不为空,但是值不等 return false; } //值相等的情况下,比较左子树的左节点跟右子树的右节点 boolean order = order(l.left, r.right); //比较左子树的右节点跟右子树的左节点 boolean order1 = order(l.right, r.left); return order && order1; }
/** * 方法二、使用迭代法 * 使用队列实现,判断目前队列里面的size,把左子树,右子树入队,然后出队,对比一下即可 */ public boolean isSymmetric2(TreeNode root) { if (root == null) { return true; } Queue<TreeNode> qe = new LinkedList<>(); //由于判断左右子树是否对称,所以是左右子树入队 qe.offer(root.left); qe.offer(root.right); while (!qe.isEmpty()) { TreeNode l = qe.poll(); TreeNode r = qe.poll(); if (l == null && r == null) {//l、r都是空,对称 continue;//下一个循环 } else if (l != null && r == null) {//l,不空,r空,不对称 return false; } else if (l == null && r != null) {//l,空,r不空,不对称 return false; } else if (l.val != r.val) {//l,r都不为空,但是值不等 return false; } qe.offer(l.left); qe.offer(r.right); qe.offer(l.right); qe.offer(r.left); } return true; }
|