栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

(LeetCode C++)对称二叉树

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

(LeetCode C++)对称二叉树

给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:

 


输入:root = [1,2,2,3,4,4,3]
输出:true
示例 2:

 


输入:root = [1,2,2,null,3,null,3]
输出:false

提示:

树中节点数目在范围 [1, 1000] 内
-100 <= Node.val <= 100

首先,二叉树的实现是:

Code:

class TreeNode
{
public:
    int val;
    TreeNode *left;
    TreeNode *right;

    TreeNode()
    {
        this->val=0;
        this->left=nullptr;
        this->right=nullptr;
    }

    TreeNode(int x)
    {
        this->val=x;
        this->left=nullptr;
        this->right=nullptr;
    }

    TreeNode(int x,TreeNode *left,TreeNode *right)
    {
        this->val=x;
        this->left=left;
        this->right=right;
    }
};

对于此题,可以使用递归和迭代的方法解决。

Method 1:递归

Code:

class Solution
{
public:
    // 递归方法
    // 左右子树相等的时候,需要满足:
    // 左子树的左边==右子树的右边
    // 左子树的右边==右子树的左边
    bool isMirror(TreeNode *left_subtree,TreeNode *right_subtree)
    {
        // 如果左右子树都为空,返回true
        if(!left_subtree && !right_subtree)
        {
            return true;
        }
        // 如果左右子树有一个不空,返回false
        if(!left_subtree || !right_subtree)
        {
            return false;
        }
        // 如果左右子树的节点值不相等,返回false
        if(left_subtree->val!=right_subtree->val)
        {
            return false;
        }
        // 递归判断子树
        return isMirror(left_subtree->left,right_subtree->right)
            && isMirror(left_subtree->right,right_subtree->left);
    }

    bool isSymmetric(TreeNode *root)
    {
        // 如果根节点为空,返回true
        if(!root)
        {
            return true;
        }
        // 递归判断
        return isMirror(root->left,root->right);
    }
};

Method 2:迭代

class Solution
{
public:
    // 迭代方法
    // 使用迭代的方法,需要借助外部的容器
    bool isSymmetric(TreeNode *root)
    {
        // 如果左右子树都为空,则返回true
        if(!root)
        {
            return true;
        }

        // 创建一个队列用来缓存树
        queue q;

        // 分别将树的根节点的左右节点放入队列
        q.push(root->left);
        q.push(root->right);

        // 队列不空就一直迭代
        while(!q.empty())
        {
            // 左节点
            auto p1=q.front();
            q.pop();

            // 右节点
            auto p2=q.front();
            q.pop();

            // 如果两个节点都是为空节点,则跳过本次循环
            if(!p1&&!p2)
            {
                continue;
            }
            // 如果左右节点有一个不为空,则返回false
            if(!p1||!p2)
            {
                return false;
            }
            // 如果两个节点的值不相等,则返回false
            if(p1->val!=p2->val)
            {
                return false;
            }

            // 1.
            // 将左节点的左子节点进队列
            q.push(p1->left);
            // 将右节点的右子节点进队列
            q.push(p2->right);
            
            // 2.
            // 将左节点的右子节点进队列
            q.push(p1->right);
            // 将右节点的左子节点进队列
            q.push(p2->left);
            
            // 其中,1和2的位置可以互换
            
        }
        //如果通过迭代对比,则返回true
        return true;
    }
};

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/symmetric-tree

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1009641.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号