面试题28:对称的二叉树

请实现一个函数,用来判断一颗二叉树是不是对称的。

  • 注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。

思路一:递归解决,写一个递归函数,参数是左右子树,从根节点开始调用,递归终结点为左右子树都为空,即对应线路上对称,或者只有一个为空,以及不相等都提出跳出,最后返回调用自身分别比较后两个节点的左右子节点。(左对右,右对左)

public class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;

        public TreeNode(int val) {
            this.val = val;

        }
    /**
     * 递归解法
     * 从上往下,递归函数设两个参数,一个先左后右,一个先右后左
     * 判断是否相等(1,值相等,2,都为空);一空则不对称
     * 只要有不相等的,肯定不对成
     * @param pRoot
     * @return
     */
    boolean isSymmetrical(TreeNode pRoot)
    {
       if (pRoot == null) return true;
       return isSymmetricalRecur(pRoot.left,pRoot.right);
    }
    private boolean isSymmetricalRecur(TreeNode root1,TreeNode root2){
        //一直相等,则一直到叶节点同为空,则对称
        if (root1 == null && root2 == null) return true;
        //有一个为空就不对称
        if (root1 == null || root2 == null) return false;
        //排除不相等的情况,不相等肯定不对称,提前跳出
        if (root1.val != root2.val){
            return false;
        }

        return isSymmetricalRecur(root1.left,root2.right) && isSymmetricalRecur(root1.right,root2.left);

    }
    }

思路二:使用队列非递归

/**
     * 非递归写法
     * 队列保证
     * @param pRoot
     * @return
     */
    boolean isSymmetrical(TreeNode pRoot)
    {
        if (pRoot == null) return true;

        Queue queueA = new LinkedList<>();
        Queue queueB = new LinkedList<>();
        queueA.offer(pRoot.left);
        queueB.offer(pRoot.right);

        TreeNode leftNode = null;
        TreeNode rightNode = null;
        //循环节点,保证往深处遍历,还能再回来
        while (!queueA.isEmpty() && !queueB.isEmpty()){
            leftNode = queueA.poll();
            rightNode = queueB.poll();

            //遇到叶节点,则跳出循环
            if (leftNode == null && rightNode == null) continue;
            if (leftNode == null || rightNode == null) return false;
            if (leftNode.val != rightNode.val) return false;

            //两两对称的加入
            queueA.offer(leftNode.left);
            queueB.offer(rightNode.right);
            queueA.offer(leftNode.right);
            queueB.offer(rightNode.left);
        }
        return true;
    }

你可能感兴趣的:(面试题28:对称的二叉树)