对称二叉树

给定一个二叉树,检查它是否是镜像对称的。

例如,二叉树 [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);
    }
}

首页 我的博客
粤ICP备17103704号