剑指 Offer(第2版)面试题 28:对称的二叉树

news/2024/7/5 3:18:07

剑指 Offer(第2版)面试题 28:对称的二叉树

  • 剑指 Offer(第2版)面试题 28:对称的二叉树
    • 解法1:递归
    • 解法2:镜像二叉树 + 前序遍历

剑指 Offer(第2版)面试题 28:对称的二叉树

题目来源:39. 对称的二叉树

解法1:递归

递归判断两个子树是否互为镜像。

两个子树互为镜像当且仅当:

  1. 两个子树的根节点值相等。
  2. 第一棵子树的左子树和第二棵子树的右子树互为镜像,且第一棵子树的右子树和第二棵子树的左子树互为镜像。

代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution
{
public:
	bool isSymmetric(TreeNode *root)
	{
		// 特判,空树是对称的二叉树
		if (root == nullptr)
			return true;
		return dfs(root->left, root->right);
	}
	bool dfs(TreeNode *root1, TreeNode *root2)
	{
		if (root1 == nullptr && root2 == nullptr)
			return true;
		if ((root1 && root2 == nullptr) || (root1 == nullptr && root2))
			return false;
		if (root1->val != root2->val)
			return false;
		return dfs(root1->left, root2->right) && dfs(root1->right, root2->left);
	}
};

复杂度分析:

时间复杂度:O(n),其中 n 是二叉树的节点数。

空间复杂度:O(depth),其中 depth 是二叉树的深度。极端情况下栈的深度将达到 O(n)。

解法2:镜像二叉树 + 前序遍历

我们发现:如果一个二叉树是对称的,则它的前序遍历序列和它的镜像二叉树的前序遍历序列相同。

代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution
{
public:
	bool isSymmetric(TreeNode *root)
	{
		if (root == nullptr)
			return true;
		vector<int> preOrderSequence, mirrorPreOrderSequence;
		preOrder(root, preOrderSequence);
		mirror(root);
		preOrder(root, mirrorPreOrderSequence);
		return preOrderSequence == mirrorPreOrderSequence;
	}
	// 辅函数 - 镜像
	void mirror(TreeNode *root)
	{
		if (root == nullptr)
			return;
		if (root->left == nullptr && root->right == nullptr)
			return;
		if (root->left)
			mirror(root->left);
		if (root->right)
			mirror(root->right);
		// swap(root->left, root->right)
		TreeNode *temp = root->left;
		root->left = root->right;
		root->right = temp;
	}
	// 辅函数 - 前序遍历
	void preOrder(TreeNode *root, vector<int> &nums)
	{
		if (root == nullptr)
		{
			nums.push_back(-1);
			return;
		}
		nums.push_back(root->val);
		preOrder(root->left, nums);
		preOrder(root->right, nums);
	}
};

复杂度分析:

时间复杂度:O(n),其中 n 是二叉树的节点个数。原树中每个节点仅被遍历一次。

空间复杂度:O(depth),其中 depth 是二叉树的深度。


http://lihuaxi.xjx100.cn/news/1889695.html

相关文章

在Nexus上配置Docker镜像仓库

现在Docker镜像的工具已不少了&#xff0c;只是在Java老牌又持久的工具Nexus上配置本地Docker仓库镜像是一件即有情怀又充份利用资源的事情。 Nexus支持多种仓库类型&#xff0c;例如&#xff1a;maven、npm、docker等。 安装Nexus &#xff08;略&#xff09; Docker镜像配…

【网络安全技术】电子邮件安全PGP,SMIME

一、PGP&#xff08;Pretty Good Privacy&#xff09; PGP是一种邮件加密手段&#xff0c;他在发邮件一方加密&#xff0c;然后发给发送方邮件服务器&#xff0c;发送方邮件服务器再发送给接收方邮件服务器&#xff0c;然后接收方再从接收方邮件服务器pop出来&#xff0c;这整…

基于docker容器化部署微服务

前言 在笔者系列文章中微服务配置隔离已经完成服务之间的配置隔离&#xff0c;服务整体来说是已经通了。 为了方便后续测试已经环境统一&#xff0c;笔者本章节会对服务进行容器化部署。由于服务器性能问题&#xff0c;本次部署采用maven完成镜像构建&#xff0c;结合docker-c…

基于C/C++的rapidxml加载xml大文件 - 下部分

下载地址: RapidXml (sourceforge.net)https://rapidxml.sourceforge.net/ 将源码添加到自己的工程中 示例测试大文件耗时: 总共293w行数据&#xff0c;大概耗时不到1s。

【EXCEL】vlookup,index/match查找函数

区别&#xff1a; 1.Vlookup函数只能查找列数据&#xff0c;即纵向查找&#xff0c;而IndexMatch函数&#xff0c;既可以纵向查找&#xff0c;也可以横向查找&#xff1b; 2、Vlookup函数查找的依据(第一个参数)必须位于数据源的第一列&#xff0c;IndexMatch函数组合则无此限制…

持续集成交付CICD:Jenkins使用GitLab共享库实现自动上传前后端项目Nexus制品

目录 一、实验 1.GitLab本地导入前后端项目 2.Jenkins新建前后端项目流水线 3.Sonarqube录入质量阈与质量配置 4.修改GitLab共享库代码 5.Jenkins手动构建前后端项目流水线 6.Nexus查看制品上传情况 7.优化代码获取RELEASE分支 8.优化Jenkins流水线项目名称 一、实验 …

第22关 深入解析K8s中的RBAC角色访问控制策略

------> 课程视频同步分享在今日头条和B站 大家好&#xff0c;我是博哥爱运维&#xff0c;在k8s上我们如何控制访问权限呢&#xff0c;答案就是Role-based access control (RBAC) - 基于角色&#xff08;Role&#xff09;的访问控制&#xff0c;&#xff08;RBAC&#xff0…

【Hive】——DDL(CREATE TABLE)

1 CREATE TABLE 建表语法 2 Hive 数据类型 2.1 原生数据类型 2.2 复杂数据类型 2.3 Hive 隐式转换 2.4 Hive 显式转换 2.5 注意 3 SerDe机制 3.1 读写文件机制 3.2 SerDe相关语法 3.2.1 指定序列化类&#xff08;ROW FORMAT SERDE ‘’&#xff09; 3.2.2 指定分隔符&#xff0…