IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Leetcode刷题-101:对称二叉树 -> 正文阅读

[数据结构与算法]Leetcode刷题-101:对称二叉树

1.题目描述

给你一个二叉树的根节点 root , 检查它是否轴对称。
在这里插入图片描述

示例1:

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

示例2:

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

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

2.题目分析

尝试通过一个中序遍历进行解题,按照初步想法,经过中序遍历后的结果如果是对称的,那么就说明树是对称的,然而好像在这种例子下出了问题。似乎单纯的遍历会面临这种奇怪的问题,虽然或许可以通过添加节点来进行辅助判断,但是假设对于每个空节点都赋值-1的话,那么似乎空节点有些多,还是继续先从递归入手。
在这里插入图片描述

2.1 递归分析

采用递归的话,我们还是试图对问题进行分解,首先对于一个待确定的根节点root,如果我们要判断它是否是一个对称数的话,首先要做的就是判断距离它最近的两个左右节点是否满足条件,如果这两个都不满足的话,那么就可以直接判断该树不是一个对称树。否则的话就继续对其左右子树进行判断。这似乎就是一个简单的递归思想。

2.1.1 递归形式

首先按照题目所给的函数格式来试图写递归的话会发现比较难处理左右子树的递的问题。所以考虑实现一个辅助递归功能compare,为了方便起见,其参数应该是两个树,我们根据compare判断这两棵树是否相等。因此确定递归形式为bool compare(TreeNode* left, TreeNode* right)

2.1.2 递归边界条件

对于一个函数的递归必须要明确的是什么时候停止执行。在本次判断中的停止条件应该是:可以确定这棵树不是一个对称树就直接返回false跳出递归。下面列举边界条件

  • 左子树右子树均为空——必然是一个对称树
  • 左子树或者右子树只有一个为空——必然不对称
  • 左右子树均不为空而且左右子树根节点值不相等——必然不对称

2.1.2 当前递归执行逻辑

在确定未遇到上述的递归边界条件时,单层的执行逻辑应该就是直接进行递的操作,也就是在下一层执行compare函数。

2.2 迭代分析

可以通过对树的特定方式遍历来判断它们位置上对称的每一对节点是否具有对称关系,如下图所示。
在这里插入图片描述
按照上述图示;

  1. 首先根节点不为空,然后。判断根节点的左右子节点是否满足条件
  2. 若1成立,则继续,判断上述两个节点的最外侧(3和3)是否满足条件
  3. 若2成立,则继续判断1中两个节点的内侧节点(4和4)是否满足条件

对于上述过程的节点保存需要一个辅助结构,其实上述过程也是一个模拟递归的过程。此时我们的遍历过程是类似一个层次遍历的,从上到下进行判断。所以类似层次遍历使用一个队列来进行存储每次遇到的对称位置的节点对。每次队列中队首的两个元素就应该是位置上对称的两个元素。

3.题目解答

3.1 递归解法

bool compare(TreeNode* left, TreeNode* right){
        if(left ==nullptr && right !=nullptr) return false;
        else if(right == nullptr && left!= nullptr) return false;
        else if(right == nullptr && right == nullptr) return true;
        else if(right->val != left->val)    return false;
        else {
            return compare(left->left,right->right)&&
            compare(left->right,right->left);
        }
    }
    bool isSymmetric(TreeNode* root) {
        if(root == nullptr) return true;
        return compare(root->left,root->right);
    }

3.2 迭代

bool isSymmetric(TreeNode* root) {
        if(root == nullptr) return true;
        // 队列保存迭代过程
        queue<TreeNode*> que;
        // 确保每次入队相邻两个元素是位置对称的
        que.push(root->left);
        que.push(root->right);
        while(!que.empty()){
            TreeNode *lts = que.front();
            que.pop();
            TreeNode *rts = que.front();
            que.pop();
            // 左右节点均为空则继续
            if(!lts && !rts) continue;
            // 左右节点有一个不为空则不对称
            if(!lts ||!rts)    return false;
            // 左右节点均不为空且值不相等则不对称
            if(lts->val != rts->val) return false;
            // 按照镜像进行入队
            que.push(lts->left);
            que.push(rts->right);
            que.push(lts->right);
            que.push(rts->left);
        }
        return true;
    }

总结:递归到底该咋写?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-09 12:59:06  更:2022-05-09 13:02:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:27:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码