在这里占个坑,记录一下学习数据结构中例题
二叉树的同构
题目:题目详情 - 03-树1 树的同构 (25 分) (pintia.cn)https://pintia.cn/problem-sets/1497448825169559552/problems/1503334324290916352
1.建树
首先理清题目意思,给出的每组数据中,仅仅表现了父节点的内容与子节点的编号的关系,无法确定根节点。
这里用结构体数组来储存树,根据数组的下标,则可确定当前节点的内容与孩子节点的位置。找到根节点的位置后,整棵树的架构便明确下来。
根节点的特殊之处在于,根节点是是无人指向的。
为了找出根节点,可以使用一个初值全为0的数组,若数组下标被指向,则反转为1。
2.判断是否为同构
设置一个递归函数(目的:判断两树是否同构),传入两棵树。
同构操作的实质是什么?我认为是交换左右子树。镜像对称的两树是同构的特殊情况,而同构是从上到下,逐渐深入,每次交换(或不交换)左右子树。
分情况进行递归的选择:
两树都为空:则一定是同构的。
只有一个是空的,或者根节点的元素不一样,一定不同构。
两个左子树都为空,则判断两右子树是否同构。(这里的左右不必纠结,也没有特殊性)
接下来判断根节点的左右节点,若左等于左,右等于右,则说明在这一步是相同的,接下来进行的操作是传入递归,比较分别比较两个左子树、两个右子树是否同构。若在根节点那一步,发生了左右交换,则比较左树的右子树和有树的左子树、左数的左和右数的右是否同构。
3.同类型题目
PTA | 程序设计类实验辅助教学平台千名教师建设,万道高质量题目,百万用户拼题的程序设计实验辅助教学平台https://pintia.cn/problem-sets/1497448825169559552
层次遍历——使用队列实现
首先根节点入队,执行循环
{
pop队列中队头的元素
判断此元素左右孩子是否为空,将其不空的左右孩子入队
}