剑指offer:树的子结构、二叉树的镜像、对称的二叉树

2024-02-01 08:32

本文主要是介绍剑指offer:树的子结构、二叉树的镜像、对称的二叉树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

剑指offer:树的子结构、二叉树的镜像、对称的二叉树

题目: 树的子结构: 输入两棵二叉树A和B,判断B是不是A的子结构。
  分析:
       1. 查找树A中与树B根节点一样的结点(树的遍历)。
       2. 判断A中以该结点为根节点的子树是不是和B具有一样的结构。 
       
       
  注:在写树的代码的时候,要时刻注意该地址是否可能是nullptr

/*struct TreeNode {int val;          //如果定义的是double类型的时候,不能直接使用==判断 struct TreeNode *left;struct TreeNode *right;TreeNode(int x) :val(x), left(NULL), right(NULL) {}
};*/
class Solution {
public://第一步检查根节点是否存在是要遍历完所有的结点,所以要定义result在最后才return bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2){bool result = false; if (pRoot1 != nullptr && pRoot2 != nullptr){// 按照根左右进行遍历 if (pRoot1->val == pRoot2->val) result = Does_has_B(pRoot1, pRoot2);if (!result) result = HasSubtree(pRoot1->left, pRoot2);if (!result) result = HasSubtree(pRoot1->right, pRoot2);}return result;}
private://第二步,检查是否含有B树,只要其中任何一个结点不相等或者树A没了,就需要return false bool Does_has_B(TreeNode* pRoot1, TreeNode* pRoot2){if (pRoot2 == nullptr) return true;if (pRoot1 == nullptr) return false;if (pRoot1->val != pRoot2->val) return false;return Does_has_B(pRoot1->left, pRoot2->left) && Does_has_B(pRoot1->right, pRoot2->right);}
};

题目:二叉树的镜像:完成一个函数,输入一棵二叉树,该函数输出它的镜像

镜像的意思其实就是,左右子树互换,但是要注意,是要递归互换。

/*struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;TreeNode(int x) :val(x), left(NULL), right(NULL) {}
};*/
class Solution {
public:void Mirror(TreeNode *pRoot) {if (pRoot == nullptr) return;TreeNode* pTemp = pRoot->left;pRoot->left = pRoot->right;pRoot->right = pTemp;if (pRoot->left != nullptr) Mirror(pRoot->left);if (pRoot->right != nullptr) Mirror(pRoot->right);//当所有的都调整完毕后,return return;}
};

题目: 实现一个函数,判断一颗二叉树是不是对称的。如果一个二叉树和它的镜像相同,则为对称二叉树。
思路:建立先序遍历的镜像形式,先序遍历本身是根左右,现在建立一种新的方式,根右左,但是要注意遍历到nullptr,

这样可以避免错误。

/*struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;TreeNode(int x) :val(x), left(NULL), right(NULL) {}
};*/
class Solution {
public:bool isSymmetrical(TreeNode* pRoot){return isSymmetrical_private(pRoot, pRoot);}
private:bool isSymmetrical_private(TreeNode* pRoot1, TreeNode* pRoot2){if (pRoot1 == nullptr && pRoot2 == nullptr) return true;if (pRoot1 == nullptr || pRoot2 == nullptr) return false;if (pRoot1->val != pRoot2->val) return false;// 等于将root1先序遍历,将root2对称先序遍历,也就是根右左 return isSymmetrical_private(pRoot1->left, pRoot2->right) && isSymmetrical_private(pRoot1->right, pRoot2->left);}
};

 

这篇关于剑指offer:树的子结构、二叉树的镜像、对称的二叉树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/666690

相关文章

python项目打包成docker容器镜像的两种方法实现

《python项目打包成docker容器镜像的两种方法实现》本文介绍两种将Python项目打包为Docker镜像的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录简单版:(一次成功,后续下载对应的软件依赖)第一步:肯定是构建dockerfile,如下:第二步

docker 重命名镜像的实现方法

《docker重命名镜像的实现方法》在Docker中无法直接重命名镜像,但可通过添加新标签、删除旧镜像后重新拉取/构建,或在DockerCompose中修改配置文件实现名称变更,感兴趣的可以了解一下... 目录使用标签(Tagging)删除旧的php镜像并重新拉取或构建使用docker Compose在Do

linux配置podman阿里云容器镜像加速器详解

《linux配置podman阿里云容器镜像加速器详解》本文指导如何配置Podman使用阿里云容器镜像加速器:登录阿里云获取专属加速地址,修改Podman配置文件并移除https://前缀,最后拉取镜像... 目录1.下载podman2.获取阿里云个人容器镜像加速器地址3.更改podman配置文件4.使用po

Docker多阶段镜像构建与缓存利用性能优化实践指南

《Docker多阶段镜像构建与缓存利用性能优化实践指南》这篇文章将从原理层面深入解析Docker多阶段构建与缓存机制,结合实际项目示例,说明如何有效利用构建缓存,组织镜像层次,最大化提升构建速度并减少... 目录一、技术背景与应用场景二、核心原理深入分析三、关键 dockerfile 解读3.1 Docke

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

Conda国内镜像源及配置过程

《Conda国内镜像源及配置过程》文章介绍Conda镜像源使用方法,涵盖临时指定单个/多个源、永久配置及恢复默认设置,同时说明main(官方稳定)、free(逐渐弃用)、conda-forge(社区更... 目录一、Conda国内镜像源二、Conda临时使用镜像源指定单个源临时指定多个源创建环境时临时指定源

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文

Docker安装MySQL镜像的详细步骤(适合新手小白)

《Docker安装MySQL镜像的详细步骤(适合新手小白)》本文详细介绍了如何在Ubuntu环境下使用Docker安装MySQL5.7版本,包括从官网拉取镜像、配置MySQL容器、设置权限及内网部署,... 目录前言安装1.访问docker镜像仓库官网2.找到对应的版本,复制右侧的命令即可3.查看镜像4.启

Gradle在国内配置镜像加速的实现步骤

《Gradle在国内配置镜像加速的实现步骤》在国内使用Gradle构建项目时,最大的痛点就是依赖下载贼慢,甚至卡死,下面教你如何配置国内镜像加速Gradle下载依赖,主要是通过改写repositori... 目录引言一、修改 build.gradle 或 settings.gradle 的 reposito