题解 | #对称的二叉树#

对称的二叉树

https://www.nowcoder.com/practice/ff05d44dfdb04e1d83bdbdab320efbcb

package com.iwen.Sword1;

import com.iwen.小码哥第三季.common.TreeNode;

import java.util.LinkedList;

/**
 * @ClassName 对称的二叉树
 * @Description TODO
 * @Author iwen
 * @Date 2023/6/12 14:19
 * @Version 1.0
 **/
public class 对称的二叉树 {

    /**
     * 给定一棵二叉树,判断其是否是自身的镜像(即:是否对称)
     * 方式一:递归,主要是使⽤递归,先判断根节点是否为空,不为空则判断左右⼦树是不是对称。
     * 如果左右⼦树都为空,则返回true,如果有⼀个为空,则返回false,如果两个都不为空的时候,除了对⽐左右两个节点的值,还需要递归,
     * 对⽐左⼦树的左⼦树和右⼦树的右⼦树是否相等,左⼦树的右⼦树和右⼦树的左⼦树是否相等。
     *
     * 方式二:另外⼀种,⾮递归的做法,是借助两个队列,按照层次,⼀个是按照从左到右添加元素,另外⼀个队列是按照从右到左添加元素,挨个取出来,进⾏对⽐,
     * 不等则说明不对称,如果相等,则再把其左右⼦树分别按照不同的顺序添加到队列中。
     * */
    public boolean isSymmetrical(TreeNode pRoot) {
        // 判断根节点是否为空,如果不为空则判断左右⼦树
        return pRoot==null || jude(pRoot.left, pRoot.right);
    }
    boolean jude(TreeNode left, TreeNode right) {
        // 如果左右两个都为空,则对称
        if (left == null && right == null) {
            return true;
        } else if (left == null || right == null) {
            // 如果左右两个有⼀个为空,那么就不对称
            return false;
        }
        // 都不为空的情况,需要判断两个的值,是不是相等
        if (left.val != right.val) {
            return false;
        } else {
            // 递归判断,左⼦树的左⼦树和右⼦树的右⼦树,左⼦树的右⼦树和右⼦树的左⼦树
            return jude(left.left, right.right) && jude(left.right,right.left);
        }
    }


    boolean isSymmetrical2(TreeNode pRoot){
        if (pRoot == null) return true;
        LinkedList<TreeNode> leftNodes = new LinkedList<>();
        LinkedList<TreeNode> rightNodes = new LinkedList<>();
        leftNodes.add(pRoot.left);
        rightNodes.add(pRoot.right);
        while (!leftNodes.isEmpty() && !rightNodes.isEmpty()) {
            TreeNode leftNode = leftNodes.poll();
            TreeNode rightNode = rightNodes.poll();
            if (leftNode == null && rightNode == null)
                continue;
            if (leftNode == null || rightNode == null)
                return false;
            // 取出来对⽐
            if (leftNode.val != rightNode.val)
                return false;
            // 从左往右添加节点
            leftNodes.add(leftNode.left);
            leftNodes.add(leftNode.right);
            // 从右往左添加节点
            rightNodes.add(rightNode.right);
            rightNodes.add(rightNode.left);
        }
        return leftNodes.isEmpty() && rightNodes.isEmpty();
    }
}

解题思想:

方式一:递归

方式二:借助队列

#算法##算法笔记#
全部评论

相关推荐

牛客263158796号:我领羊一面后十天不挂也不推进 今天问hr说等前序的第一批意向发完看情况再看是否推进
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务