【Java】对称二叉树

题目

请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。

思路

左树的左子树等于右树的右子树,左树的右子树等于右树的左子树,对应位置刚好相反,判断两子树相反位置上的值是否相等即可

测试用例

1.功能测试(对称二叉树;结构不对称二叉树;结构对称但值不对称二叉树)

2.特殊测试(根结点为null;单个结点;所有结点的值都相等的二叉树)

代码

public class symmetrical {
    public static class TreeNode{
        int val;
        TreeNode left=null;
        TreeNode right=null;
        public TreeNode(int val) {
            this.val = val;
        }
    }
    public static boolean isSymmetrical(TreeNode pRoot){
        if (pRoot==null){
            return true;
        }
        return isEqual(pRoot.left,pRoot.right);
    }
    private static boolean isEqual(TreeNode pRoot1,TreeNode pRoot2){
        if (pRoot1==null&&pRoot2==null)
            return true;
        if(pRoot1==null||pRoot2==null){
            return false;
        }
       return pRoot1.val==pRoot2.val&&isEqual(pRoot1.left,pRoot2.right)&&isEqual(pRoot1.right,pRoot2.left);

    }

    public static void main(String[] args) {
        TreeNode nodea1=new TreeNode(8);
        TreeNode nodea21=new TreeNode(6);
        TreeNode nodea22=new TreeNode(6);
        TreeNode nodea31=new TreeNode(5);
        TreeNode nodea32=new TreeNode(7);
        TreeNode nodea33=new TreeNode(7);
        TreeNode nodea34=new TreeNode(5);
        nodea1.left=nodea21;
        nodea1.right=nodea22;
        nodea21.left=nodea31;
        nodea21.right=nodea32;
        nodea22.left=nodea33;
        nodea22.right=nodea34;
        System.out.println(isSymmetrical(nodea1));
    }
}

代码优化

//原始代码
if (pRoot1==null&&pRoot2!=null){
            return false;
        }
if (pRoot1!=null&&pRoot2==null){
            return false;
       }  
 //优化后代码
if (pRoot1==null||pRoot2==null){
            return false;
        }      
<think>好的,我现在需要帮助用户找到用Java实现的对称二叉树迭代解法。首先,我应该回顾一下对称二叉树的定义,即一个二叉树和它的镜像相同。也就是说,每个节点的左子树和右子树都是对称的。 用户已经提到递归解法,现在需要迭代方法。根据引用[2]和引用[4],迭代法通常使用队列或队列来辅助。引用[2]提到用队列,每次取出两个节点比较,然后将它们的子节点按相反顺序入队。引用[4]提到可能需要处理非满二叉树的情况,用特定值填充空节点,但可能在Java中不需要,可以用null表示。 我需要确保迭代解法正确处理对称性。步骤应该是初始化队列,加入根节点的左右子节点,然后循环取出两个节点比较值,如果不同则返回false。接着,将左节点的左子节点和右节点的右子节点入队,再将左节点的右子节点和右节点的左子节点入队。注意处理null的情况,如果其中一个为null而另一个不是,直接返回false。 现在需要编写Java代码。使用队列的话,可以选择LinkedList作为队列的实现。每次循环取出两个节点比较。注意,入队的顺序需要对应镜像的位置。例如,左节点的左和右节点的右,左节点的右和右节点的左。 可能的问题点:如何处理空节点?比如,当左子节点为null时,右子节点的对应位置是否也为null。在代码中需要检查两者是否为null,或者是否同时不为null但值相等。 测试用例需要考虑各种情况,比如对称的树、不对称的树、单节点树等。 根据这些思路,现在可以组织代码结构,并确保符合Java语法。</think>### Java实现对称二叉树的迭代解法 对称二叉树的迭代解法可以通过队列(BFS)实现,核心思路是逐层比较镜像位置的节点。具体实现步骤如下: 1. **初始化队列**:将根节点的左右子节点同时入队 2. **循环处理队列**:每次取出两个节点比较值,并检查结构对称性 3. **子节点入队**:按镜像顺序将左节点的左子节点与右节点的右子节点配对入队,再将左节点的右子节点与右节点的左子节点配对入队 ```java import java.util.LinkedList; import java.util.Queue; public class Solution { public boolean isSymmetric(TreeNode root) { if (root == null) return true; Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root.left); queue.offer(root.right); while (!queue.isEmpty()) { TreeNode leftNode = queue.poll(); TreeNode rightNode = queue.poll(); // 两个节点均为空时继续循环 if (leftNode == null && rightNode == null) continue; // 结构不对称直接返回false if (leftNode == null || rightNode == null) return false; // 值不相等时返回false if (leftNode.val != rightNode.val) return false; // 按镜像顺序入队子节点 queue.offer(leftNode.left); queue.offer(rightNode.right); queue.offer(leftNode.right); queue.offer(rightNode.left); } return true; } } ``` #### 代码解析 - **队列初始化**:根节点的左右子节点同时入队,为后续比较建立基础[^2] - **循环处理**:每次取两个节点比较值和结构,确保镜像对称性 - **子节点入队规则**:左节点的左子节点对应右节点的右子节点,左节点的右子节点对应右节点的左子节点[^4] - **终止条件**:队列处理完毕未发现不对称则为true,任意一次比较失败立即返回false #### 复杂度分析 - 时间复杂度:$O(n)$,每个节点恰好访问一次 - 空间复杂度:$O(n)$,最坏情况队列需要存储所有叶子节点 ### 相关问题 1. **如何用递归实现对称二叉树判断?** 递归法通过比较左右子树的镜像关系实现,详见引用[^3] 2. **迭代法中为什么选择队列而不是栈?** 队列实现广度优先遍历更直观,栈也可实现但需调整节点处理顺序 3. **如何处理非完全二叉树的情况?** 迭代法中空节点用`null`占位,结构不对称时直接返回false[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值