LeetCode题解:Symmetric Tree(有4种解法)

本文介绍了一种判断二叉树是否为镜像对称的方法。通过递归比较左右子树及其镜像来实现,提供了多种实现思路,包括层次遍历、递归对比等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).

For example, this binary tree is symmetric:

    1
   / \
  2   2
 / \ / \
3  4 4  3

But the following is not:

    1
   / \
  2   2
   \   \
   3    3

题解:

判断一棵二叉树是否是自身的镜像,即:一棵爱美的二叉树去照镜子,发现镜子里的自己竟然和自己长得一样诶!!!

文字看不懂的话,就看看题目给的Example咯 -..-

解题思路:

这道题其实有很多的思路,我都列出来吧:

1、我看到这道题的想法是这样的:一棵有左右孩子,而且非空的二叉树,对它的左孩子进行层次遍历,并把结果存起来;对它的右孩子进行逆序的层次遍历(每一层从右到左遍历),并把结果存起来。最后把左右孩子进行对比。显然这个方法是比较笨的 -..-

2、把所有左子树和“镜像”对应的右子树进行对比,不断的递归。如果每一次对比返回的结果都是true,则是镜像二叉树。

3、中序遍历,思路和1、差不多

4、分别遍历根节点的左右子树,获得一个字符串。然后对比。

代码:

这里的代码呢我都是以LeetCode上先发出来的大神的代码为主,主要是考虑到LeetCode上有人会因为代码思想相似给人Vote Down,所以我也本着不鼓励重复发明轮子的思想,在这贴上首发的大神们的代码。反正都是学习嘛,都OK啦。

1、by:lucastan

#include<queue>
using namespace std;
typedef pair<TreeNode*,TreeNode*> nodepair;
class Solution {
public:
    bool isSymmetricRecursive(TreeNode*a,TreeNode*b){
        if(a){
            return b && a->val==b->val && 
                isSymmetricRecursive(a->left,b->right) &&
                isSymmetricRecursive(a->right,b->left);
        }
        return !b;
    }
    bool isSymmetricRecursive(TreeNode*root){
        return !root || isSymmetricRecursive(root->left,root->right);
    }
    bool isSymmetric(TreeNode *root) {
        // Level-order BFS.
        queue<nodepair> q;
        if(root)
            q.push(make_pair(root->left,root->right));
        while(q.size()){
            nodepair p=q.front(); q.pop();
            if(p.first){
                if(!p.second)return false;
                if(p.first->val != p.second->val) return false;
                // the order of children pushed to q is the key to the solution.
                q.push(make_pair(p.first->left,p.second->right));
                q.push(make_pair(p.first->right,p.second->left));
            }
            else if(p.second) return false;
        }
        return true;
    }
};

2、by:lzklee

 public boolean checkSymmetric(TreeNode lsubTree,TreeNode rsubTree){
    if(lsubTree==null&&rsubTree==null) return true;
    else if(lsubTree!=null&&rsubTree==null) return false;
    else if(lsubTree==null&&rsubTree!=null) return false;
    else if(lsubTree.val!=rsubTree.val) return false;
    boolean lt=checkSymmetric(lsubTree.left,rsubTree.right);
    boolean rt=checkSymmetric(lsubTree.right,rsubTree.left);
    return lt&&rt;
}
public boolean isSymmetric(TreeNode root) {
    if(root==null) return true;
    return checkSymmetric(root.left,root.right);
} public boolean checkSymmetric(TreeNode lsubTree,TreeNode rsubTree){
    if(lsubTree==null&&rsubTree==null) return true;
    else if(lsubTree!=null&&rsubTree==null) return false;
    else if(lsubTree==null&&rsubTree!=null) return false;
    else if(lsubTree.val!=rsubTree.val) return false;
    boolean lt=checkSymmetric(lsubTree.left,rsubTree.right);
    boolean rt=checkSymmetric(lsubTree.right,rsubTree.left);
    return lt&&rt;
}
public boolean isSymmetric(TreeNode root) {
    if(root==null) return true;
    return checkSymmetric(root.left,root.right);
}
3、 by: walnutown

<span style="font-size:12px;">public class Solution {
    ArrayList<String> nodeArr;

    public boolean isSymmetric(TreeNode root) {
        // Start typing your Java solution below
        // DO NOT write main() function
        if (root == null){
            return true;
        }
        nodeArr = new ArrayList<String>();
        inorderTraversal(root);

    // compare in-order traversal list
        int i = 0;
        int j = nodeArr.size() -1;
        while (i < j){
            if (!nodeArr.get(i).equals(nodeArr.get(j))){
                return false;
            }
            i++;
            j--;
        }
        return true;      
    }

    public void inorderTraversal(TreeNode n){
    // if empty node, save as ‘#’ to occupy this place
        if (n == null){
            nodeArr.add("#");
            return;
        }
        if (n.left == null && n.right == null) {
            nodeArr.add(""+n.val);
        } else {
            inorderTraversal(n.left);
            nodeArr.add(""+n.val);
            inorderTraversal(n.right);
        }
    }
}</span>
4、by: cow12331
public boolean isSymmetric(TreeNode root) {
    return left(root).equals(right(root));
}

public static String left(TreeNode root) {
    if(root == null) return "#";
    else {
        return root.val + left(root.left) + left(root.right);
    }
} 

public static String right(TreeNode root) {
    if(root == null) return "#";
    else {
        return root.val + right(root.right) + right(root.left);
    }
} 







内容概要:本文档详细介绍了基于MATLAB实现多目标差分进化(MODE)算法进行无人机三维路径规划的项目实例。项目旨在提升无人机在复杂三维环境中路径规划的精度、实时性、多目标协调处理能力、障碍物避让能力和路径平滑性。通过引入多目标差分进化算法,项目解决了传统路径规划算法在动态环境和多目标优化中的不足,实现了路径长度、飞行安全距离、能耗等多个目标的协调优化。文档涵盖了环境建模、路径编码、多目标优化策略、障碍物检测与避让、路径平滑处理等关键技术模块,并提供了部分MATLAB代码示例。 适合人群:具备一定编程基础,对无人机路径规划和多目标优化算法感兴趣的科研人员、工程师和研究生。 使用场景及目标:①适用于无人机在军事侦察、环境监测、灾害救援、物流运输、城市管理等领域的三维路径规划;②通过多目标差分进化算法,优化路径长度、飞行安全距离、能耗等多目标,提升无人机任务执行效率和安全性;③解决动态环境变化、实时路径调整和复杂障碍物避让等问题。 其他说明:项目采用模块化设计,便于集成不同的优化目标和动态环境因素,支持后续算法升级与功能扩展。通过系统实现和仿真实验验证,项目不仅提升了理论研究的实用价值,还为无人机智能自主飞行提供了技术基础。文档提供了详细的代码示例,有助于读者深入理解和实践该项目。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值