题目描述

​
一棵有点权的有根树如果满足以下条件,则被轩轩称为对称二叉树:
1. 二叉树;
2. 将这棵树所有节点的左右子树交换,新树和原树对应位置的结构相同且点权相等。下图中节点内的数字为权值,节点外的id表示节点编号。现在给出一棵二叉树,希望你找出它的一棵子树,该子树为对称二叉树,且节点数最多。请输出这棵子树的节点数。
注意:只有树根的树也是对称二叉树。本题中约定,以节点T为子树根的一棵“子 树”指的是:节点T和它的全部后代节点构成的二叉树。​

输入格式:

第一行一个正整数n,表示给定的树的节点的数目,规定节点编号1∼n,其中节点1是树根。第二行n个正整数,用一个空格分隔,第i个正整数vi代表节点i的权值。接下来n行,每行两个正整数li, ri,分别表示节点i的左右孩子的编号。如果不存在左/右孩子,则以−1表示。两个数之间用一个空格隔开。

输出格式:

输出文件共一行,包含一个整数,表示给定的树的最大对称二叉子树的节点数。

限制:

空间限制:128MByte
时间限制:1秒

样例:

输入:输入 #1
2
1 3
2 -1
-1 -1 输入 #2
10
2 2 5 5 5 5 4 4 2 3
9 10
-1 -1
-1 -1
-1 -1
-1 -1
-1 2
3 4
5 6
-1 -1
7 8
输出:输出 #1
1输出 #2
3

1.求结点数

此类题有相同之处(树上dfs):2.求权值

3.求路径

又有一个通用代码段(仅dfs):

int dfs(int x){int ans=0;if(!x)return 0;else if(c(l[x],r[x]))ans=si[x];else ans=max(dfs(l[x]),dfs(r[x]));return ans;
}

上面的可以改!

此题要关注两点,一是树的结构,二是结点的权值,权值很容易,但结构比较难找

结构:略。

代码如下:

#include<iostream>
using namespace std;
const int N=1111111;
int n,u,v,w[N],l[N],r[N],si[N];
int g(int x){if(!x)return 0;else if(si[x])return si[x];si[x]=1+g(l[x])+g(r[x]);return si[x];
}
bool c(int x,int y){if(x==0&&y==0)return true;else if(w[x]!=w[y])return false;else if(si[x]!=si[y])return false;else return c(l[x],r[y])&&c(r[x],l[y]);
}
int dfs(int x){int ans=0;if(!x)return 0;else if(c(l[x],r[x]))ans=si[x];else ans=max(dfs(l[x]),dfs(r[x]));return ans;
}
int main(){cin>>n;for(int i=1;i<=n;i++){cin>>w[i];}for(int i=1;i<=n;i++){cin>>u>>v;if(u!=-1)l[i]=u;if(v!=-1)r[i]=v;}g(1);cout<<dfs(1)<<endl;return 0;
}

对称二叉树 详解(C++)相关推荐

  1. 线索二叉树详解(C语言版)

    文章目录 一.定义 二.结构 三.常用操作 结语 附录 一.定义 前面学习了二叉树,在操作过程中发现了几个问题: 问题一:二叉树如何才能实现从一个指定结点开始遍历呢?         问题二:在二叉树 ...

  2. 数据结构-二叉树-详解

    目录 一.树的概念及结构 1.1树的概念 1.2 树的相关概念​ 1.3树的表示 1.4树在实际中的运用(表示文件系统的目录树结构) 二. 二叉树的概念及结构 2.1概念 2.2特殊二叉树 2.3二叉 ...

  3. 【Java】数据结构---二叉树 详解

    快速导航: 1 树形结构 1.1 树形结构 概念 1.2 需要记忆概念 1.3 树的表现形式 2 二叉树 2.1 概念 2.2 两种特殊的二叉树 2.3 二叉树的性质 2.4 相关例题讲解 2.4 二 ...

  4. 【线索二叉树详解】数据结构06(java实现)

    线索二叉树 1. 线索二叉树简介 定义: 在二叉树的结点上加上线索的二叉树称为线索二叉树. 二叉树的线索化: 对二叉树以某种遍历方式(如先序.中序.后序或层次等)进行遍历,使其变为线索二叉树的过程称为 ...

  5. 【二叉树详解】二叉树的创建、遍历、查找以及删除等-数据结构05

    二叉树 1. 二叉树简介 定义: 每一个结点的子节点数量不超过 2 二叉树的结点分为:左节点.右节点 满二叉树: 每个结点都有两个子结点的二叉树(除了叶子结点外) 完全二叉树: 除去最后一层,是一个满 ...

  6. 常用算法(冒泡、插入、选择、快速)和二叉树详解

    同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率.算法分析的目的在于选择合适算法和改进算法. 计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间.这是一个关 ...

  7. 深入浅出!二叉树详解,包含C语言代码

    [导读]:树是数据结构中的重中之重,尤其以各类二叉树为学习的难点.在考研中,二叉树也是常考的模块.本文主要讲二叉树操作的相关知识.请大家跟随小编一起来复习吧. 本篇针对面试中常见的二叉树操作作个总结: ...

  8. Python二叉树详解笔记

    目录 二叉树数据结构 简介 为何选择树 树的主要应用包括: 二叉树的类型 满二叉树(Full binary tree) 完全二叉树(Complete binary tree) 完美二叉树(Perfec ...

  9. 《数据结构C语言版》——二叉树详解(图文并茂)

    哈喽!这里是一只派大鑫,不是派大星.本着基础不牢,地动山摇的学习态度,从基础的C语言语法讲到算法再到更高级的语法及框架的学习.更好地让同样热爱编程(或是应付期末考试 狗头.jpg)的大家能够在学习阶段 ...

  10. 二叉树详解(Java)

    1.树 相信大家对于二叉树的概念并不陌生,什么是树?什么是二叉树? 1.1.树的定义 树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合.把它叫做树是因为它看起来 ...

最新文章

  1. wxWidgets:wxRichTextCtrl类用法
  2. RISC-V评估系列
  3. PTA:7-1 还原二叉树 (25 分)
  4. 等效低通信号=带通信号的复包络
  5. php套壳_PHP-T
  6. 各种密码在线转换网址
  7. 《啊哈,C语言》 第一章课后习题练习记录
  8. keil5 mdk安装教程
  9. Easypoi 报表模板设置
  10. 麒麟座IIC-STM32F103RET6(1)-完成基础LED
  11. 项目管理-挣值分析方法学习总结
  12. zdm各命令的功能和作用_ZDM命令 注释
  13. OpenCV学习(二十) :直方图匹配、对比:calcHist(),minMaxLoc(),compareHist()
  14. js案例---支付10s倒计时
  15. 什么是IDC服务器租用?
  16. 管理者必看!如何打通数据孤岛问题?附52页数据决策分析平台方案
  17. [英语语法]词法之独立主格
  18. 顺丰测试开发工程师一面
  19. 两条轨迹相似度算法,轨迹相似性度量
  20. CentOS 7安装Jenkins

热门文章

  1. Linux的系统程序包管理
  2. FireEye实验室在一次水坑式攻击中发现IE 0DAY
  3. CA证书服务器(6) 利用CA证书配置安全Web站点
  4. 使用Cargo入门rust语言
  5. vmvare虚拟机地址总是更换的解决方法
  6. mysql 四种隔离级别
  7. WPF中的Application类。
  8. 使用sever2008做DHCP中继代理
  9. /var/log/messages Logging not working on Centos 7
  10. sicp 3.9题解答