题目链接:题目详情 - 7-15 Tree of Love (pintia.cn)

样例1输入:

27
5 4 6 22 3 23 7 20 2 21 8 18 9 1 10 19 11 24 17 25 12 26 16 27 13 15 14
5 6 22 4 7 23 20 3 8 21 9 18 2 10 11 24 19 12 26 25 13 27 14 15 16 17 1

样例1输出:

Yes
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

样例2输入:

11
4 8 10 2 5 1 6 3 9 11 7
10 8 4 5 2 6 11 9 7 3 1

样例2输出:

No
1 2 4 10 5 6 11 7 3

分析:首先题目中说的无序遍历其实就是中序遍历,我们首先要做的就是根据树的中序遍历和后序遍历来确定出这棵二叉树,然后我们就可以判断这棵树是否对称,这个也很好判断,我们用两个队列,一开始里面只有根节点,然后一个队列访问左子树,另一个队列访问右子树,我们对应地取出两个队列的队首元素,如果一个队列的首部元素有左子树,那么另一个队列的首部元素就要有右子树,同理,如果一个队列的首部元素有右子树,那么另一个队列的首部元素就要有左子树。如果一直都满足这样的条件,那么这棵树就是对称的,否则就不是对称的。我们在建树过程中顺便存储一下树的叶子节点并记录其深度,然后对叶子节点按照顺序进行判断其深度是否呈现题目中所给的规律就行,因为是对称的,所以只要一半满足规律即可。最后就是一个外部轮廓问题,这个外部轮廓有点歧义,比如示例二中的树如下图:

他的轮廓是1 2 4 10 5 6 11 7 3 1,我一开始以为他的轮廓是1 2 4 8 10 5 6 11 9 7 3

后来发现他的轮廓就是从根节点开始一直往左孩子方向搜索,直到某个节点没有左孩子为止,右边轮廓就是一直往右孩子方向搜索,直到某个节点没有右孩子为止,这个地方需要大家注意一下,其他没什么了,细节见代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
using namespace std;
const int N=1e3+10;
int l[N],r[N];
int a[N],b[N],c[N],mp[N];
int d[N];//记录节点深度
vector<int> p;//统计叶子节点
int build_23(int l1,int r1,int l2,int r2,int h)
{if(l1>r1) return 0;
//  printf("%d ",c[r2]);l[c[r2]]=build_23(l1,mp[c[r2]]-1,l2,l2+(mp[c[r2]]-1-l1),h+1);r[c[r2]]=build_23(mp[c[r2]]+1,r1,l2+(mp[c[r2]]-1-l1)+1,r2-1,h+1);d[c[r2]]=h;if(!l[c[r2]]&&!r[c[r2]]) p.push_back(c[r2]);return c[r2];
}
int main()
{int n;cin>>n;for(int i=1;i<=n;i++)cin>>b[i],mp[b[i]]=i;for(int i=1;i<=n;i++)cin>>c[i];int root=build_23(1,n,1,n,1);bool flag=true;//判断该树是否对称 queue<int>q1,q2;q1.push(root);q2.push(root);while(!q1.empty()){int t1=q1.front(),t2=q2.front();q1.pop();q2.pop();if(l[t1]&&r[t2])//左边有左子树并且右边有右子树 {q1.push(l[t1]);q2.push(r[t2]);}else if(l[t1]||r[t2])//左边有左子树和右边有右子树有且只有一个成立 {flag=false;break;}if(r[t1]&&l[t2])//左边有右子树并且右边也有左子树 {q1.push(r[t1]);q2.push(l[t2]);}else if(r[t1]||l[t2])//左边有右子树和右边有左子树有且只有一个成立 {flag=false;break;}}if(!q2.empty()) flag=false;//这个时候也是不对称的 int i=1;while(i<p.size()/2&&d[p[i]]>=d[p[i-1]]) i++;while(i<p.size()/2&&d[p[i]]<=d[p[i-1]]) i++;if(i<p.size()/2) flag=false;if(flag) puts("Yes");else puts("No");int a[N],b[N],len1=0,len2=0; queue<int> q;q.push(root);while(!q.empty()){int t=q.front();q.pop();a[++len1]=t;if(l[t])q.push(l[t]);else break;}q.push(root);while(!q.empty()){int t=q.front();q.pop();b[++len2]=t;if(r[t])q.push(r[t]);else break;}if(a[len1]==p[0]) len1--;if(b[len2]==p[p.size()-1]) len2--;for(int i=1;i<=len1;i++)printf("%d ",a[i]);for(int i=len2;i>1;i--)p.push_back(b[i]);for(int i=0;i<p.size();i++){printf("%d",p[i]);if(i!=p.size()-1) printf(" ");}return 0;
}

爱之树(二叉树建树+搜索)相关推荐

  1. 二叉查找(排序)树/二叉树----建树,遍历

    二叉查找(排序)树/二叉树----建树,遍历 import java.util.ArrayList; import java.util.LinkedList; import java.util.Lis ...

  2. 数据结构与算法之判断一棵树是否为搜索二叉树、判断一棵树是否是完全二叉树

    数据结构与算法之判断一棵树是否为搜索二叉树.判断一棵树是否是完全二叉树 目录 判断一棵树是否为搜索二叉树 判断一棵树是否是完全二叉树 1. 判断一棵树是否为搜索二叉树 概念:搜索树就是中序遍历的结果是 ...

  3. 【CCCC】L2-011 玩转二叉树 (25分),二叉树建树与遍历(我讨厌树,@L2-006)

    problem L2-011 玩转二叉树 (25分) 给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列.所谓镜面反转,是指将所有非叶结点的左右孩子对换.这里假设 ...

  4. 判断一棵树是否是搜索二叉树 判断一棵树是否是完全二叉树

    package class_04;import java.util.LinkedList; import java.util.Queue; /*** * 判断一棵树是否是搜索二叉树* 判断一棵树是否是 ...

  5. 机器学习 KD树_递归搜索(matlab实现)

    文章目录 思路 效果 代码 mian Kd_Tree_Create recursive Kd_Tree_Search 思路 第二个版本:链接 KD树基本思路: 建立KD树(Kd_Tree_Create ...

  6. 二叉树广度优先搜索、深度优先搜索(前序、中序、后序)遍历,动图详解-Java/Kotlin双版本代码

    自古逢秋悲寂寥,我言秋日胜春朝 二叉树结构说明 本博客使用树节点结构,如下所示: Kotlin 版本 class TreeNode(var value: String, var leftNode: T ...

  7. 数据结构(十五) -- C语言版 -- 树 - 二叉树的操作进阶之创建、插入、删除、查询、销毁

    内容预览 零.读前说明 一.概述 二.数据模型分析创建 2.1.节点的结构模型 2.2.操作函数结构模型 三.创建 四.插入 4.1.在树中的某一个叶子节点位置插入新节点 4.2.在树中的某一个非叶子 ...

  8. 字符串匹配数据结构 --Trie树 高效实现搜索词提示 / IDE自动补全

    文章目录 1. 算法背景 2. Trie 树实现原理 2.1 Trie 树的构建 2.2 Trie树的查找 2.3 Trie树的遍历 2.4 Trie树的时间/空间复杂度 2.5 Trie 树 Vs ...

  9. NLP之NBGBT:基于朴素贝叶斯(count/tfidf+网格搜索+4fCrva)、梯度提升树(w2c+网格搜索+4fCrva)算法对IMDB影评数据集进行文本情感分析(情感二分类预测)

    NLP之NB&GBT:基于朴素贝叶斯(count/tfidf+网格搜索+4fCrva).梯度提升树(w2c+网格搜索+4fCrva)算法对IMDB影评数据集进行文本情感分析(情感二分类预测) ...

最新文章

  1. thinkcmf 去掉index.php,​ThinkCMF5.0如何修改入口文件 解决方法
  2. qt 分辨率问题 安卓_Windows下基于Qt开发Android应用
  3. linux 设置防火墙ssh,centos 8 ssh命令(服务器设置、防火墙配置等)
  4. 新农人谋定新理念-农业大健康·李孟:“玩”出农业新花样
  5. linux全自动安装光盘,CentOS7全自动安装光盘制做详解
  6. DAX2012 R3安装
  7. 当你辛辛苦苦写的博客文章被无情复制,成为了他的原创,你作何感想?
  8. Netty常见面试题 与 答案
  9. 荣耀V40 Pro全新外观曝光:熟悉的矩阵镜头造型
  10. 网易云会员歌曲下载记录(.ncm-.mp3)
  11. vue实现 可拖拽的div
  12. 维基百科(Wikipedia)网址
  13. 5G无线系统设计与国际标准 pdf和Word
  14. iOS 音频本地和在线播放器
  15. JS中操作字符串的常用方法
  16. error C2041: illegal digit ‘9‘ for base ‘8‘ | error C2059: syntax error: ‘bad suffix on number‘
  17. Git提交报错git-upload-pack
  18. android文件管理器listview,浅析Android文件管理器(项目一)
  19. pytorch rnn 实现手写字体识别
  20. ValueError: The number of elements in ‘fill‘ does not match the number of bands of the image (3 != 4

热门文章

  1. Tekton系列之理论篇【二】
  2. scratch词语接龙 电子学会图形化编程scratch等级考试四级真题和答案解析2021-6
  3. 深度学习(9):FastFCN论文翻译与学习
  4. 2020长三角区块链应用创新大赛复赛第三场于能链科技成功举办!
  5. 华为nova5ipro的优缺点_华为nova5pro的优缺点有哪些?
  6. Typora工具免费版下载
  7. 记录一下NotImplementedError: Cannot convert a symbolic Tensor的解决办法
  8. 论文Learning to Solve Large-Scale Security-Constrained Unit Commitment Problems阅读笔记
  9. 传奇开服教程完整版GOM引擎超详细的单机架设图文教程(小白一看就会)
  10. 在vc中使用xtremetoolkit界面库-----安装及环境配置