二叉树相关的题,判断二叉树是否是单值二叉树,相同的树,对称二叉树,另一棵树的子树,KY11 二叉树遍历

news/2025/1/9 10:39:53/

文章目录

  • 判断二叉树是否是单值二叉树
  • 100. 相同的树
  • 101. 对称二叉树
  • 572. 另一棵树的子树
  • KY11 二叉树遍历

判断二叉树是否是单值二叉树

965. 单值二叉树

在这里插入图片描述

单值二叉树,所有结点的值都相同的二叉树即为单值二叉树,判断某一棵二叉树是否是单值二叉树的一般步骤如下:
 1.判断根的左孩子的值与根结点是否相同。
 2.判断根的右孩子的值与根结点是否相同。
 3.判断以根的左孩子为根的二叉树是否是单值二叉树。
 4.判断以根的右孩子为根的二叉树是否是单值二叉树。
若满足以上情况,则是单值二叉树。

//判断二叉树是否是单值二叉树
bool isUnivalTree(BTNode* root)
{if (root == NULL)//根为空,是单值二叉树return true;if (root->left && root->left->val != root->val)//左孩子存在,但左孩子的值不等于根的值return false;if (root->right && root->right->val != root->val)//右孩子存在,但右孩子的值不等于根的值return false;return isUnivalTree(root->left) && isUnivalTree(root->right);//左子树是单值二叉树并且右子树是单值二叉树
}

100. 相同的树


100. 相同的树

在这里插入图片描述
判断两棵二叉树是否相同,也可以将其分解为子问题:
 1.比较两棵树的根是否相同。
 2.比较两根的左子树是否相同。
 3.比较两根的右子树是否相同。

//判断两棵二叉树是否相同
bool isSameTree(BTNode* p, BTNode* q)
{if (p == NULL&&q == NULL)//两棵树均为空,则相同return true;if (p == NULL || q == NULL)//两棵树中只有一棵树为空,则不相同return false;if (p->val != q->val)//两棵树根的值不同,则不相同return false;return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);//两棵树的左子树相同并且右子树相同,则这两棵树相同
}

101. 对称二叉树

对称二叉树

在这里插入图片描述

要判断某二叉树是否是对称二叉树,则判断其根结点的左子树和右子树是否是镜像对称即可。

因为是镜像对称,所以左子树的遍历方式和右子树的遍历方式是不同的,准确来说,左子树和右子树的遍历是反方向进行的。

如下图

在这里插入图片描述
图中红蓝轨迹同时进行,同时结束。若在遍历过程中发现镜像对称的某两个结点值不同,则无需继续遍历,此时已经可以判断该树不是对称二叉树,只有当红蓝轨迹成功遍历完毕后,才能断定该树是对称二叉树。

代码:

//判断镜像位置是否相等
bool travel(BTNode* left, BTNode* right)
{if (left == NULL&&right == NULL)//红蓝轨迹同时遍历到NULL,函数返回return true;if (left == NULL || right == NULL)//红蓝指针中,一个为NULL,另一个不为NULL,即镜像不相等return false;if (left->val != right->val)//红蓝指针指向的结点值不同,即镜像不相等return false;//子问题:左子树遍历顺序:先左后右,右子树遍历顺序:先右后左。若两次遍历均成功,则是对称二叉树return travel(left->left, right->right) && travel(left->right, right->left);
}
//对称二叉树
bool isSymmetric(BTNode* root)
{if (root == NULL)//空树是对称二叉树return true;return travel(root->left, root->right);//判断镜像位置是否相等
}

572. 另一棵树的子树

572. 另一棵树的子树

在这里插入图片描述

判断 subRoot 是否是二叉树 root 的子树,即检验 root 中是否包含和 subRoot 具有相同结构和结点值的子树,其中 root 和 subRoot 均为非空二叉树。

思路:
 依次判断以 root 中某一个结点为根的子树是否与subRoot相同。
在这里插入图片描述

实际上,当发现 root 中的某一个子树与 subRoot 相匹配时,便不再继续比较其他子树,所以图中只会比较到序号2就结束比较了。

//比较以root和subRoot为根结点的两棵树是否相等
bool Compare(BTNode* root, BTNode* subRoot)
{if (root == NULL&&subRoot == NULL)//均为空树,相等return true;if (root == NULL || subRoot == NULL)//一个为空另一个不为空,不相等return false;if (root->val != subRoot->val)//结点的值不同,不相等return false;//比较两棵树的子结点return Compare(root->left, subRoot->left) && Compare(root->right, subRoot->right);
}
//另一个树的子树
bool isSubtree(BTNode* root, BTNode* subRoot)
{if (root == NULL)//空树,不可能是与subRoot相同(subRoot非空)return false;if (Compare(root, subRoot))//以root和subRoot为根,开始比较两棵树是否相同return true;//判断root的左孩子和右孩子中是否有某一棵子树与subRoot相同return isSubtree(root->left, subRoot) || isSubtree(root->right,subRoot);
}

KY11 二叉树遍历

KY11 二叉树遍历

在这里插入图片描述
思路:
 根据前序遍历所得到的字符串,我们可以很容易地将其对应的二叉树画出来
在这里插入图片描述
其实很容易发现其中的规律,我们可以依次从字符串读取字符:
 1.若该字符不是#,则我们先构建该值的结点,然后递归构建其左子树和右子树。
 2.若该字符是#,则说明该位置之下不能再构建结点了,返回即可。

构建完树后,使用中序遍历打印二叉树的数据即可。

代码:

#include <iostream>
using namespace std;typedef struct TreeNode {struct TreeNode* left;struct TreeNode* right;char data;
} TreeNode;int i = 0;
//创建树
TreeNode* CreateTree(string& s)
{if(s[i] == '#'){i++;return nullptr;}//不是NULL,构建结点TreeNode* root = new TreeNode;root->left = nullptr;root->right = nullptr;root->data = s[i++];//递归构建左子树root->left = CreateTree(s);//递归构建右子树root->right = CreateTree(s);return root;
}void Inorder(TreeNode* root) {if (root == nullptr)return;Inorder(root->left);cout << root->data << ' ';Inorder(root->right); 
}int main() {string s;cin >> s;TreeNode* root = CreateTree(s);Inorder(root);return 0;
}

http://www.ppmy.cn/news/1561220.html

相关文章

关于Java抽象工厂模式的面试题目及其答案

Java中有23种设计模式&#xff0c;主要分为三类&#xff1a;创建型模式、结构型模式和行为型模式‌。 创建型模式 创建型模式关注于对象的创建&#xff0c;提供了更灵活的对象创建方式。主要包括以下几种&#xff1a; ‌单例模式‌&#xff1a;确保一个类只有一个实例&#…

Reactor测试框架之StepVerifier

Reactor测试框架之StepVerifier 测试步骤1、创建StepVerifier实例2、添加断言3、执行验证 代码实例 在响应式编程中&#xff0c;Reactor框架提供了StepVerifier测试类&#xff0c;用于对响应式序列进行断言和验证。StepVerifier主要用于对Publisher发出的元素序列进行逐步的、精…

网络安全的主要防护对象有哪些?

网络基础设施 网络设备&#xff1a; 路由器&#xff1a;作为网络的交通枢纽&#xff0c;是重点防护对象。其配置文件包含了网络拓扑、路由策略等关键信息&#xff0c;若被篡改&#xff0c;可能导致网络瘫痪或流量被恶意引导。例如&#xff0c;攻击者可能通过利用弱密码或未修复…

电商数据整合中API接口的挑战与解决方案

在电子商务的快速发展中&#xff0c;API&#xff08;应用程序编程接口&#xff09;接口扮演着至关重要的角色。它们不仅促进了不同系统之间的数据交换和功能集成&#xff0c;还使得电商平台能够高效地运行并为用户提供优质的服务。然而&#xff0c;在电商数据整合的过程中&…

k8s中,Containerd运行时与Dockerd运行时区别

Containerd运行时与Dockerd运行时区别 文章目录 Containerd运行时与Dockerd运行时区别结论Kubernetes 中的选择主要区别&#xff1a;Docker 容器运行时containerd 容器运行时 结论 Docker 是一个完整的容器管理平台&#xff0c;适合开发、构建、测试、交付和部署应用&#xff…

maven的pom.xml配置详解

pom.xml pom项目标签 例子 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi=

uni-app开发-习惯养成小程序/app介绍

目录 一:功能概述 二:功能部分代码和截图 一:功能概述 1 习惯目标生成 创建习惯:用户可以添加新的习惯目标,每个习惯可以包含名称、描述、图标、目标天数。 关联习惯完成:用户通过设定达成目标以后,生成习惯养成记录。 2 习惯打卡 简单快捷的打卡:提供一个直观的界面…

STM32F1学习——PWMI模式(IC输入捕获)

一、输入捕获测频率 在STM32中输入捕获和输出比较共用一套电路&#xff0c;既然STM32能够使用OC来输出PWM波&#xff0c;他同样也能使用IC来测量PWM的频率和占空比。测量频率和占空比有两种方式&#xff0c;一种是测频法&#xff0c;一种是测周法&#xff0c;两种方法分别适用于…