剑指 Offer 28. 对称的二叉树(Leecode 101)
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1 / \ 2 2 / \ / \ 3 4 4 3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
1 / \ 2 2 \ \ 3 3
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ class Solution { public boolean isSymmetric(TreeNode root) { return isMirror(root.left,root.right); } public boolean isMirror(TreeNode t1, TreeNode t2) { if(t1 ==null && t2 == null) //两个子节点 都为空 为对称 { return true; } if(t1 == null || t2 == null) //两个子节点 一个为空 一个不为空 则不对称 { return false; } boolean result = (t1.val == t2.val) && isMirror(t1.right,t2.left) &&isMirror(t1.left,t2.right); return result; } }
class Solution { public boolean isSymmetric(TreeNode root) { return root == null ? true : recur(root.left, root.right); } boolean recur(TreeNode L, TreeNode R) { if(L == null && R == null) return true; if(L == null || R == null || L.val != R.val) return false; return recur(L.left, R.right) && recur(L.right, R.left); } }
中序遍历二叉树
结果队列是首尾对称的。
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { Deque<TreeNode> res = new LinkedList<TreeNode>(); public boolean isSymmetric(TreeNode root) { inorderTraversal(root); if(res.size() == 1) return true; //如果只有一个根节点,那它是对称的。 while(res.size() > 1) { TreeNode first = res.pollFirst(); TreeNode last = res.pollLast(); if(first.val != last.val) { return false; } } return true; } public Deque<TreeNode> inorderTraversal(TreeNode root) { if(root != null) { inorderTraversal(root.left); res.add(root); inorderTraversal(root.right); return res; } else { return res; } } }