给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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 { * public int val; * public TreeNode left; * public TreeNode right; * public TreeNode(int x) { val = x; } * } */ public bool IsSymmetric(TreeNode root) { if(root == null) return true; //两条队列 Queue<TreeNode> left = new Queue<TreeNode>(); Queue<TreeNode> right = new Queue<TreeNode>(); left.Enqueue(root.left); right.Enqueue(root.right); while(left.Count > 0 && left.Count == right.Count) { //保证左边的结点,对上的是右边的结点 TreeNode l = left.Dequeue(); TreeNode r = right.Dequeue(); if(l == null && r == null) continue; if(l == null || r == null) return false; if(l.val == r.val) { left.Enqueue(l.left);//左边的先左后右 left.Enqueue(l.right); right.Enqueue(r.right);//右边的先右后左 right.Enqueue(r.left); } else { return false; } } return left.Count == right.Count; }
递归的方式:
public class Solution { public bool IsSymmetric(TreeNode root) { return IsSymmetric(root,root); } public bool IsSymmetric(TreeNode one,TreeNode two) { //前两个判断可以保证one和two都不为null if(one == null && two == null) return true; if(one == null || two == null) return false; return (one.val == two.val) && IsSymmetric(one.left,two.right) && IsSymmetric(one.right,two.left); } }