给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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
思路:递归
先判断左右结点是否都不为空,然后将左右结点作为参数传进递归函数,递归函数对两个结点的左右结点做出判断,决定返回不同的值或将不同的参数传入递归函数,不过写的较为复杂
时间复杂度:O(n)空间复杂度:O(n)
/**
* 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 class Solution {
public bool leftandright(TreeNode p,TreeNode q)
{
if(p.val!=q.val)
return false;
if(p.left==null&&p.right==null&&q.left==null&&q.right==null)
return true;
else if((p.left==null&&q.right!=null)||(p.right==null&&q.left!=null)||(q.left==null&&p.right!=null)||(q.right==null&&p.left!=null))
return false;
else if(p.left!=null&&q.right!=null&&p.right==null&&q.left==null)
return leftandright(p.left,q.right);
else if(p.left==null&&q.right==null&&p.right!=null&&q.left!=null)
return leftandright(p.right,q.left);
else
return leftandright(p.left,q.right)&&leftandright(p.right,q.left);
}
public bool IsSymmetric(TreeNode root)
{
if(root==null)
return true;
TreeNode p=root.left;
TreeNode q=root.right;
if((p==null&&q!=null)||(p!=null&&q==null))
return false;
else if(p==null&&q==null)
return true;
return leftandright(p,q);
}
}
看来题解后才知道还可以这样写递归函数,这样显得更为简洁
public class Solution {
public bool isMirror(TreeNode t1, TreeNode t2) {
if (t1 == null && t2 == null) return true;
if (t1 == null || t2 == null) return false;
return (t1.val == t2.val)
&& isMirror(t1.right, t2.left)
&& isMirror(t1.left, t2.right);
}
public bool IsSymmetric(TreeNode root) {
return isMirror(root,root);
}
}
题目链接:https://leetcode-cn.com/problems/symmetric-tree/submissions/