12.翻转、对称二叉树,二叉树的深度

news2025/2/11 6:44:45

反转二叉树

递归写法

很简单

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        if(root==nullptr)return root;
        TreeNode* tmp;
        tmp=root->left;
        root->left=root->right;
        root->right=tmp;
        invertTree(root->left);
        invertTree(root->right);
        return root;
    }
};

迭代写法

先序遍历

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        stack<TreeNode*> sta;
        if(root)sta.push(root);
        TreeNode* cur;
        while(!sta.empty()){
            cur=sta.top();
            sta.pop();
            if(cur->left)sta.push(cur->left);
            if(cur->right)sta.push(cur->right);
            TreeNode* tmp=cur->left;
            cur->left=cur->right;
            cur->right=tmp;
        }
        return root;
    }
};

后序也可以;

但是中序遍历不行;

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        stack<TreeNode*> sta;
        if(root)sta.push(root);
        TreeNode* cur;
        while(!sta.empty()){
            cur=sta.top();
            sta.pop();
            if(cur){
                if(cur->right)sta.push(cur->right);
                
                sta.push(cur);
                sta.push(nullptr);
                if(cur->left)sta.push(cur->left);
            }else{
                cur=sta.top();
                sta.pop();
                TreeNode* tmp=cur->left;
                cur->left=cur->right;
                cur->right=tmp;
            }
 
        }
        return root;
    }
};

但是这个是可以过oj的

对称二叉树

反转之后再和原来的树比较,一模一样就是对称的。

但是这样还要复制一棵树,浪费空间。

应该两个指针同时遍历,镜像遍历:

只能是后序遍历?

  • 前序遍历

image-20250210210421096

这种情况会出现假阳性,根本在于前序遍历不能唯一标识一棵树

  • 中序遍历

同理,中序遍历也不能唯一标识一棵树:加法的二义性

image-20250210211147749

  • 后序遍历

后序遍历也不能唯一标识一棵树,例子同前序遍历的例子。

所以:并非只有后序遍历才行

class Solution {
public:
    bool Compare(TreeNode* cur1,TreeNode* cur2){
        if(cur1->left&&cur2->right){
            if(cur1->left->val!=cur2->right->val)return 0;
        }else if(cur1->left&&!cur2->right){
            return 0;
        }else if(!cur1->left&&cur2->right){
            return 0;
        }
        if(cur2->left&&cur1->right){
            if(cur2->left->val!=cur1->right->val)return 0;
        }else if(cur2->left&&!cur1->right){
            return 0;
        }else if(!cur2->left&&cur1->right){
            return 0;
        }
        return 1;
    }
    bool isSymmetric(TreeNode* root) {
        stack<TreeNode*> sta1;
        stack<TreeNode*> sta2;
        if(root){
            sta1.push(root);
            sta2.push(root);
        }
        TreeNode* cur1,*cur2;
        while(!sta1.empty()&&!sta2.empty()){
            cur1=sta1.top();
            sta1.pop();
            cur2=sta2.top();
            sta2.pop();
            if(!Compare(cur1,cur2))return 0;
            if(cur1->right)sta1.push(cur1->right);
            if(cur1->left)sta1.push(cur1->left);
           
            if(cur2->left)sta2.push(cur2->left);
            if(cur2->right)sta2.push(cur2->right);
        }
        return 1;
    }
};

只需要在比较时添加上子节点的因素,就可以避免假阳性

二叉树最大深度

层序遍历

class Solution {
public:
    int maxDepth(TreeNode* root) {
       queue<TreeNode*> que;
       if(root) que.push(root);
       int cur_size=1,nxt_size=0;
       int depth=0;
       while(!que.empty()){
        TreeNode* cur=que.front();
        que.pop();
        
        if(cur->left){
            nxt_size++;
            que.push(cur->left);
        }
        if(cur->right){
            nxt_size++;
            que.push(cur->right);
        }
        if(--cur_size==0){
            depth++;
            cur_size=nxt_size;
            nxt_size=0;
            }
       }
       return depth;
    }
};

更简洁的写法:

class Solution {
public:
    int maxDepth(TreeNode* root) {
        if (root == NULL) return 0;
        int depth = 0;
        queue<TreeNode*> que;
        que.push(root);
        while(!que.empty()) {
            int size = que.size();
            depth++; // 记录深度
            for (int i = 0; i < size; i++) {
                TreeNode* node = que.front();
                que.pop();
                if (node->left) que.push(node->left);
                if (node->right) que.push(node->right);
            }
        }
        return depth;
    }
};

二叉树最小深度

层序遍历

class Solution {
public:
    int minDepth(TreeNode* root) {
        queue<TreeNode*> que;
       if(root) que.push(root);
       int cur_size=1,nxt_size=0;
       int depth=0;
       while(!que.empty()){
        TreeNode* cur=que.front();
        que.pop();
        if(!cur->left&&!cur->right)return depth+1;
        if(cur->left){
            nxt_size++;
            que.push(cur->left);
        }
        if(cur->right){
            nxt_size++;
            que.push(cur->right);
        }
        if(--cur_size==0){
            depth++;
            cur_size=nxt_size;
            nxt_size=0;
        }
        
       }
       return depth;
    }
};

->right){
nxt_size++;
que.push(cur->right);
}
if(–cur_size==0){
depth++;
cur_size=nxt_size;
nxt_size=0;
}

   }
   return depth;
}

};


> 判断有没有叶节点

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2296188.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字孪生智慧停车管理可视化平台

采用图扑可视化技术搭建智慧停车管理平台&#xff0c;实现了全面的数据整合与实时监控&#xff0c;提升了停车场运营效率和用户体验。通过 HT 可视化界面&#xff0c;管理者能够实时观察和分析停车位使用情况&#xff0c;进行精准调度与优化决策。

win10 llamafactory模型微调相关②

微调 使用微调神器LLaMA-Factory轻松改变大语言模型的自我认知_llamafactory 自我认知-CSDN博客 【大模型微调】使用Llama Factory实现中文llama3微调_哔哩哔哩_bilibili 样本数据集 &#xff08;数据集管理脚本处需更改&#xff0c;见报错解决参考1&#xff09; 自我认知微…

车载测试工具 --- CANoe VH6501 进行Not Acknowledge (NAck) 测试

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…

使用 AlexNet 实现图片分类 | PyTorch 深度学习实战

前一篇文章&#xff0c;CNN 卷积神经网络处理图片任务 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 本篇文章内容来自于 强化学习必修课&#xff1a;引领人工智能新时代【梗直哥瞿炜】 使用 AlexNet 实现图片分类…

Linux系统引导与服务管理

目录 一、Linux引导过程 1、引导过程概述 1.1、BIOS开机自检 1.2、MBR读取 1.3、加载引导加载程序&#xff08;GRUB&#xff09; 1.4、内核加载 1.5、初始化进程&#xff08;init&#xff09; 二、服务 2.1、服务类型 2.2、服务管理工具 三、运行级别 四、systemd …

【Hadoop】大数据权限管理工具Ranger2.1.0编译

目录 ​编辑一、下载 ranger源码并编译 二、报错信息 报错1 报错2 报错3 报错4 一、下载 ranger源码并编译 ranger官网 https://ranger.apache.org/download.html 由于Ranger不提供二进制安装包&#xff0c;故需要maven编译。安装其它依赖&#xff1a; yum install gcc …

C++ 使用CURL开源库实现Http/Https的get/post请求进行字串和文件传输

CURL开源库介绍 CURL 是一个功能强大的开源库&#xff0c;用于在各种平台上进行网络数据传输。它支持众多的网络协议&#xff0c;像 HTTP、HTTPS、FTP、SMTP 等&#xff0c;能让开发者方便地在程序里实现与远程服务器的通信。 CURL 可以在 Windows、Linux、macOS 等多种操作系…

探店小程序:解锁商业新生态,定制未来

在数字化浪潮席卷全球的今天&#xff0c;商业的边界正在被重新定义。随着移动互联网技术的飞速发展&#xff0c;探店小程序作为一种新兴的商业模式&#xff0c;正以其独特的优势迅速成为连接商家与消费者的桥梁。我们刚刚为一家客户成功交付了一款集分销、分润、商业模式定制开…

【人工智能】如何在VSCode中使用DeepSeek?

文章目录 前言一、准备工作二、安装DeepSeek插件步骤1、扩展图标搜索DeepSeep2、安装DeepSeek插件3、使用测试DeepSeekBito文心一言 结论 前言 介绍在VSCode中调用DeepSeek插件工具&#xff0c;可以进行对话、编码。 一、准备工作 确保已经安装好了VSCode软件。 二、安装D…

机器学习 - 进一步理解最大似然估计和高斯分布的关系

一、高斯分布得到的是一个概率吗&#xff1f; 高斯分布&#xff08;也称为正态分布&#xff09;描述的是随机变量在某范围内取值的概率分布情况。其概率密度函数&#xff08;PDF&#xff09;为&#xff1a; 其中&#xff0c;μ 是均值&#xff0c;σ 是标准差。 需要注意的是…

Office/WPS接入DeepSeek等多个AI工具,开启办公新模式!

在现代职场中&#xff0c;Office办公套件已成为工作和学习的必备工具&#xff0c;其功能强大但复杂&#xff0c;熟练掌握需要系统的学习。为了简化操作&#xff0c;使每个人都能轻松使用各种功能&#xff0c;市场上涌现出各类办公插件。这些插件不仅提升了用户体验&#xff0c;…

如何在Android Studio中开发一个简单的Android应用?

Android Studio是开发Android应用的官方集成开发环境&#xff08;IDE&#xff09;&#xff0c;它提供了许多强大的功能&#xff0c;使得开发者能够高效地创建Android应用。如果你是Android开发的初学者&#xff0c;本文将引导你如何在Android Studio中开发一个简单的Android应用…

第40天:Web开发-JS应用VueJS框架Vite构建启动打包渲染XSS源码泄露代码审计

#知识点 1、安全开发-VueJS-搭建启动&打包安全 2、安全开发-VueJS-源码泄漏&代码审计 一、Vue搭建创建项目启动项目 1、Vue 框架搭建->基于nodejs搭建&#xff0c;安装nodejs即可 参考&#xff1a;https://cn.vuejs.org/ 已安装18.3或更高版本的Node.js 2、Vue 创建…

[数据结构] Set的使用与注意事项

目录 Set的说明 常见方法说明 注意事项 TreeSet使用案例 Set的说明 Set与Map主要的不同有两点: Set是继承自Collection的接口类,Set中只存储了Key. 常见方法说明 方法解释boolean add(E e)添加元素,但重复元素不会被添加成功void clear()清空集合boolean contains(Object…

安当SLA操作系统登录双因素认证:全方位保障Windows系统登录安全

一、产品概述 在当今数字化时代&#xff0c;Windows系统面临着诸多安全挑战&#xff0c;如弱口令问题等。安当SLA&#xff08;System Login Agent&#xff09;作为一款强大的双因素登录认证产品&#xff0c;通过支持OTP动态口令和USBKey硬件令牌认证&#xff0c;有效解决多种W…

操作系统|ARM和X86的区别,存储,指令集

文章目录 主频寄存器寄存器在硬件中的体现是什么寄存器的基本特性硬件实现寄存器类型 内存和寄存器的区别内存&#xff08;Memory&#xff09;和磁盘&#xff08;Disk&#xff09;指令的执行ARM Cortex-M3与Thumb-2指令集Thumb-2 与流水线虚拟地址指令的执行 多核CPU芯片间的通…

Mp4视频播放机无法播放视频-批量修改视频分辨率(帧宽、帧高)

背景 家人有一台夏新多功能 视频播放器(夏新多功能 视频播放器),用来播放广场舞。下载了一些广场舞视频, 只有部分视频可以播放,其他视频均无法播放,判断应该不是帧速率和数据速率的限制, 分析可能是播放器不支持帧高度大于720的视频。由于视频文件较多,需要借助视频编…

【浏览器多开】Google Chrome 谷歌浏览器分身术

谷歌浏览器分身术&#xff08;多开&#xff09;&#xff1a; 复制已有谷歌浏览器图标—>右键–>属性的目标栏中&#xff0c;添加 --user-data-dir自定义文件夹路径 参数。 例如&#xff1a; C:\MySpace\02Installed\Chrome\Chrome-bin\99.0.4844.51\chrome.exe –user-d…

《LeetCode Hot100》 Day01

Day01 轮转数组 思路&#xff1a; &#xff08;1&#xff09; 使用O(1) 空间复杂度解决&#xff0c;就需要原地解决&#xff0c;不能创建新的数组。 &#xff08;2&#xff09; 先整体反转数组&#xff0c;再反转前k个数&#xff0c;再反转剩下的数。即可完整本题。 &…

【图片合并转换PDF】如何将每个文件夹下的图片转化成PDF并合并成一个文件?下面基于C++的方式教你实现

医院在为患者进行诊断和治疗过程中&#xff0c;会产生大量的医学影像图片&#xff0c;如 X 光片、CT 扫描图、MRI 图像等。这些图片通常会按照检查时间或者检查项目存放在不同的文件夹中。为了方便医生查阅和患者病历的长期保存&#xff0c;需要将每个患者文件夹下的图片合并成…