【题目链接】

ybt 1981:【18NOIP普及组】对称二叉树
洛谷 P5018【NOIP2018 普及组】 对称二叉树

【题目考点】

  1. 二叉树

【解题思路】

  1. 先求出二叉树中各子树的结点数
  2. 遍历二叉树,判断每个子树是否是对称二叉树
  • 判断一个二叉树是否是对称二叉树:
  • 对称变换:将该树中所有结点的左右子树交换。显然,一棵树经过两次对称变换后,会变为原来的树。
  • 两树对称:如果树1经过对称变换可以变为树2,那么称树1与树2对称。显然,树1与树2对称时,树2与树1对称。
  • 如果一个二叉树是对称二叉树,那么其左子树应该与右子树对称。
    • 证明:二叉树是对称的,那么其经过对称变换后的左子树,是由原右子树变换过来的。已知对称变换后的树与原树相同,那么变换后的左子树与原左子树相同,那么原左子树与原右子树是对称的。
  • 设函数check(),参数为树1、树2两棵树的根,该函数判断树1、树2是否对称。
  • 判断两棵树是否对称:
    • 如果两棵树都是空树(根结点地址都为-1),那么它们是对称的。
    • 如果两棵树都不是空树,同时满足如下条件时,二者才是对称的
      • 两棵树根结点的权值应该相同
      • 两棵树的结点数应该相同
      • 树1的左子树应该与树2右子树对称。
      • 树1的右子树应该与树2的左子树对称

【题解代码】

解法1:

#include<bits/stdc++.h>
using namespace std;
#define N 1000005
typedef struct Node
{int val, left, right;//val:权值, left:左孩子地址 right:右孩子地址
}Node;
Node tree[N];//tree[i],为id为i的结点
int treeNodeNum[N];//treeNodeNum[i]保存id为i的结点的子树的结点数。
int n;
int mxNodeNum;//结点数量最大的对称子树的结点数//判断以root1为根的子树和以root2为根的子树是否对称
bool check(int root1, int root2)
{if(root1 == -1 && root2 == -1)//空结点,相同return true;else if(root1 != -1 && root2 != -1 && //左右子树都有结点tree[root1].val == tree[root2].val && //树根结点权相同,treeNodeNum[root1] == treeNodeNum[root2] && //树结点数相同check(tree[root1].left, tree[root2].right) && //经过对称变换后,root2树的右子树应该与root1树的左子树对称check(tree[root1].right, tree[root2].left))//经过对称变换后,root2树的左子树应该与root1树的右子树对称return true;elsereturn false;
}//获取树的结点数
int getNodeNum(int root)
{if(root == -1)return 0;else{int nodeNum = getNodeNum(tree[root].left) + getNodeNum(tree[root].right) + 1;treeNodeNum[root] = nodeNum;return nodeNum;}
}//确定结点最多的对称的子树的结点数
void Search(int root)
{if(root != -1){if(treeNodeNum[root] <= mxNodeNum)//剪枝,如果当前子树的结点数已经比获得的最大对称子树结点数要小,那么没必要再搜索下去。return;if(check(tree[root].left, tree[root].right))//如果树root是对称的,那么其左右子树对称mxNodeNum = treeNodeNum[root];//如果对称,记录结点数。由于已有剪枝操作,此时treeNodeNum[root]一定大于mxNodeNumelse{Search(tree[root].left);Search(tree[root].right);}}
}int main()
{scanf("%d\n", &n);for(int i = 1; i <= n; ++i)scanf("%d", &tree[i].val);for(int i = 1; i <= n; ++i)scanf("%d %d", &tree[i].left, &tree[i].right);getNodeNum(1);//初始化树的各子树结点数Search(1);//从根结点开始,遍历所有子树,找出对称子树,并看其结点数,保存最大结点数printf("%d", mxNodeNum);return 0;
}

信息学奥赛一本通 1981:【18NOIP普及组】对称二叉树 | 洛谷 P5018【NOIP2018 普及组】 对称二叉树相关推荐

  1. 信息学奥赛一本通 1979:【18NOIP普及组】龙虎斗 | 洛谷 P5016 [NOIP2018 普及组] 龙虎斗

    [题目链接] ybt 1979: [18NOIP普及组]龙虎斗 洛谷 P5016 [NOIP2018 普及组] 龙虎斗 [题目考点] 1. long long类型使用 已知变量a, b是int类型的变 ...

  2. 信息学奥赛一本通 1392:繁忙的都市(city) | 洛谷 P2330 [SCOI2005]繁忙的都市

    [题目链接] ybt 1392:繁忙的都市(city) 洛谷 P2330 [SCOI2005]繁忙的都市 [题目考点] 1. 图论 最小生成树 [解题思路] 将题目叙述转为图论概念,交叉路口为顶点,道 ...

  3. 信息学奥赛一本通 1375:骑马修栅栏(fence) | 洛谷 P2731 [USACO3.3]骑马修栅栏 Riding the Fences

    [题目链接] ybt 1375:骑马修栅栏(fence) 洛谷 P2731 [USACO3.3]骑马修栅栏 Riding the Fences [题目考点] 1. 图论:欧拉回路 欧拉回路存在的条件: ...

  4. 信息学奥赛一本通 1978:【18NOIP普及组】标题统计 | 洛谷 P5015 [NOIP2018 普及组] 标题统计

    [题目链接] ybt 1978:[18NOIP普及组]标题统计 洛谷 P5015 [NOIP2018 普及组] 标题统计 [题目考点] 1. 字符串 读入带空格的字符串 将带空格的字符串读入字符数组 ...

  5. 信息学奥赛一本通 ybt 1933:【05NOIP普及组】循环 | 洛谷 P1050 [NOIP2005 普及组] 循环

    [题目链接] ybt 1933:[05NOIP普及组]循环 洛谷 P1050 [NOIP2005 普及组] 循环 [题目考点] 1.高精度 2.数学 [解题思路] 要求最后k位的循环长度,可以从低位向 ...

  6. 信息学奥赛一本通 1937:【06NOIP普及组】数列 | 洛谷 P1062 [NOIP2006 普及组] 数列

    [题目链接] ybt 1937:[06NOIP普及组]数列 洛谷 P1062 [NOIP2006 普及组] 数列 [题目考点] 1. 数制 [解题思路] 如果k为2,那么这个数列 第1项为202^02 ...

  7. 信息学奥赛一本通 1961:【13NOIP普及组】计数问题 | 洛谷 P1980 [NOIP2013 普及组] 计数问题

    [题目链接] ybt 1961:[13NOIP普及组]计数问题 洛谷 P1980 [NOIP2013 普及组] 计数问题 [题目考点] 1. 数字拆分 [解题思路] 遍历1~n的各个数字,对每个数字做 ...

  8. 信息学奥赛一本通 1414:【17NOIP普及组】成绩 | 洛谷 P3954 [NOIP2017 普及组] 成绩

    [题目链接] ybt 1414:[17NOIP普及组]成绩 洛谷 P3954 [NOIP2017 普及组] 成绩 [题目考点] 1. 算术表达式 2. 自动类型转换 低精度类型与高精度类型计算结果是高 ...

  9. 信息学奥赛一本通 1924:【03NOIP普及组】栈 | 洛谷 P1044 [NOIP2003 普及组] 栈

    [题目链接] ybt 1924:[03NOIP普及组]栈 洛谷 P1044 [NOIP2003 普及组] 栈 [题目考点] 递推.递归 栈 [解题思路]:一维递推 设数组a,a[i]表示i个数组成的数 ...

最新文章

  1. IOS数据存储之文件沙盒存储
  2. Python结合mysql的实战_python连接mysql,实战。实现ATM类似功能。
  3. 编程软件python中的if用法-总结Python编程中函数的使用要点
  4. OSChina 周三乱弹 —— 爸爸说,这个是从他硬盘里掉出来的
  5. SQL Server更新某一列中多个字典码对应内容(sql示例)
  6. python切片长度_python的间隔切片技巧
  7. mysql merge查询速度_MySQL 查询优化之 Index Merge
  8. x86基础之数与数据类型
  9. 利用python调用百度api实现黑白图像处理
  10. 单层感知器为什么不能解决异或(XOR)问题
  11. 产品经理如何营销自己
  12. dango mysql 的问题
  13. 电脑录音软件大全,推荐一波优秀的录音软件!
  14. 一个月瘦10斤的计划
  15. 触发器 jackey
  16. 基于PaddleOCR识别火车票信息
  17. html5 | 通过js实现对网页文本内容语音朗读 | 教程
  18. JavaSE基础——J2SE概述
  19. 针对JWT简介与原理,代码实例,以及oauth2+JWT+RSA的集成配置
  20. 为什么推荐使用付费代理IP

热门文章

  1. 分享一下:推荐一个网站,练习CSS3
  2. 怎样编写一个Photoshop滤镜(3)-- Scripting Plug-ins
  3. 运行初始化过程代码笔记
  4. 什么是机器学习?有哪些分类?怎样上手开发?终于有人讲明白了
  5. 我们分析了全美Top Business Analyst 和 Data Science专业,最后给你总结了这几点
  6. FreeModbus TCP传输初始化
  7. 一文详解,RocketMQ事务消息
  8. 简单的Postman,还能玩出花?
  9. 究竟什么时候该使用MQ?
  10. 2020年Java程序员应该学习的10大技术