判断二叉树是否对称

对称的二叉树

http://www.nowcoder.com/questionTerminal/ff05d44dfdb04e1d83bdbdab320efbcb

递归

1. 分析

不对称的条件:结点X的左右子树不对称,包括左右子树某一个为null,左右孩子的val不同,左孩子的左子树与右孩子的右子树不对称等等
递归的base case是假设知道左右两个子树是否为null、根以及左右子树是否对称。

2. 代码

public class Solution {
    boolean isSymmetrical(TreeNode pRoot)
    {
        if(pRoot == null){
            return true;
        }
        return check(pRoot.left, pRoot.right);
    }
    public boolean check(TreeNode left, TreeNode right){
        if(left== null && right == null){
            return true;
        }else if((left == null || right == null) || (left.val != right.val)){
            return false;
        }
        return check(left.left, right.right)&&check(left.right, right.left);

    }
}

3. 复杂度

时间:O(n)
空间:O(n)

非递归

2.1 分析

广度优先遍历,辅助队列,对称的节点成对入队和出队,出队判断是否对称。深度优先的方法同理,只需要修改出栈时接收的顺序。

2.2 代码

import java.util.*;
public class Solution {
    boolean isSymmetrical(TreeNode pRoot)
    {
        if(pRoot == null || (pRoot.left == null && pRoot.right == null)){
            return true; 
        }
        Queue<TreeNode> q = new LinkedList<>();
        q.offer(pRoot.left);
        q.offer(pRoot.right);
        TreeNode left = null;
        TreeNode right = null;
        while(!q.isEmpty()){
            left = q.poll();
            right = q.poll();
            if(left==null && right == null){
                continue;
            }else if(left==null || right == null){
                return false;
            }
            if(left.val != right.val){
                return false;
            }
            q.offer(left.left);
            q.offer(right.right);
            q.offer(left.right);
            q.offer(right.left);
        }
        return true;
    }
}

2.3 复杂度

时间:O(n)
空间:O(n)

全部评论

相关推荐

躺尸修仙中:因为很多92的也去卷中小厂,反正投递简历不要钱,面试不要钱,时间冲突就推,不冲突就面试积累经验
点赞 评论 收藏
分享
死在JAVA的王小美:哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈,我也是,让我免了一轮,但是硬气拒绝了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务