leetcode_二叉树验证(BFS、哈希集合)
题目描述:
二叉树上有 n 个节点,按从 0 到 n - 1 编号,其中节点 i 的两个子节点分别是 leftChild[i] 和 rightChild[i]。 只有 所有 节点能够形成且 只 形成 一颗 有效的二叉树时,返回 true;否则返回 false。 如果节点 i 没有左子节点,那么 leftChild[i] 就等于 -1。右子节点也符合该规则。 注意:节点没有值,本问题中仅仅使用节点编号。
这题算是一个非常中规中矩的二叉树题…给出每个结点的左右孩子结点序列,判断它是不是二叉树。
从下面几个方面排除:
1.有结点入度多于1的情况肯定是不对的;
2.存在多个入度为零的点(根)是有问题的,题目写明只有一棵二叉树;
对于第一种情况,先找到根节点,然后bfs遍历,若多次遍历到一个结点,返回false;
这里的bfs用到了stl库中的unordered_set,简单用法为:
#include<unorder_set>
#include<iostream>
using namespace std; int main(){
unorder_set<int> wow;
int x=;
wow.insert(x); //将x添加至哈希集合wow中
bool y=wow.count(); //查找哈希集合中是否有2,只返回0或1
int z=wow.size(); //返回哈希集合元素个数
return ;
}
通过构造哈希集合,将bfs遍历到的元素加入集合中,利用count查询集合是否已经包含了该元素;
第二种情况的解决思路很简单,bfs将树中元素全部遍历,若存在未遍历到的点,则最后集合中元素个数会与题目给出的n不符合,在代码最后返回set.size()==n即可。
贴代码:
class Solution {
public:
bool validateBinaryTreeNodes(int n, vector<int>& leftChild, vector<int>& rightChild) {
int rudu[]={};
for(int i=;i<n;i++){
if(leftChild[i]!=-) rudu[leftChild[i]]++;
if(rightChild[i]!=-) rudu[rightChild[i]]++;
}
int root=-;
for(int i=;i<n;i++){
if(rudu[i]==){
root=i;
break;
}
}
if(root==-) return false;
unordered_set <int> seen;
seen.insert(root);
queue <int> q;
q.push(root);
while(!q.empty()){
int x=q.front();
q.pop();
if(leftChild[x]!=-){
if(seen.count(leftChild[x])) return false;
seen.insert(leftChild[x]);
q.push(leftChild[x]);
}
if(rightChild[x]!=-){
if(seen.count(rightChild[x])) return false;
seen.insert(rightChild[x]);
q.push(rightChild[x]);
}
}
return seen.size()==n;
}
};
leetcode_二叉树验证(BFS、哈希集合)的更多相关文章
- 哈希集合——hashSet
/** 哈希集合特点:存取顺序不确定,同一个哈希值的位置可以存放多个元素, 哈希集合存放元素的时候是先判断哈希地址值:hashCode()是否相同,如果不同 ...
- UVA 10651 Pebble Solitaire(bfs + 哈希判重(记忆化搜索?))
Problem A Pebble Solitaire Input: standard input Output: standard output Time Limit: 1 second Pebble ...
- [Swift]LeetCode705. 设计哈希集合 | Design HashSet
Design a HashSet without using any built-in hash table libraries. To be specific, your design should ...
- [TimLinux] Python __hash__ 可哈希集合
规则: __hash__ 应该返回一个整数,hash()函数计算基础类型的hash值 可哈希集合:set(), forzenset(), dict() 三种数据结构操作要求 key 值唯一,判断唯一的 ...
- LeetCode 705:设计哈希集合 Design HashSet
题目: 不使用任何内建的哈希表库设计一个哈希集合 具体地说,你的设计应该包含以下的功能 add(value):向哈希集合中插入一个值. contains(value) :返回哈希集合中是否存在这个值. ...
- C#泛型集合之——哈希集合
1.特点:HashSet 中元素不重复,容量为元素个数,自动增大.是一组值,是高性能的数学集合. 2.创建: (1)HashSet<类型> 集合名 = new HashSet<类型& ...
- Leetcode705.Design HashSet设置哈希集合
不使用任何内建的哈希表库设计一个哈希集合 具体地说,你的设计应该包含以下的功能 add(value):向哈希集合中插入一个值. contains(value) :返回哈希集合中是否存在这个值. rem ...
- Java实现 LeetCode 705 设计哈希集合(使用数组保存有没有被用过)
705. 设计哈希集合 不使用任何内建的哈希表库设计一个哈希集合 具体地说,你的设计应该包含以下的功能 add(value):向哈希集合中插入一个值. contains(value) :返回哈希集合中 ...
- C#LeetCode刷题之#705-设计哈希集合(Design HashSet)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4114 访问. 不使用任何内建的哈希表库设计一个哈希集合 具体地说 ...
随机推荐
- IOCP完成端口
转:https://blog.csdn.net/piggyxp/article/details/6922277 本系列里完成端口的代码在两年前就已经写好了,但是由于许久没有写东西了,不知该如何提笔,所 ...
- PDF各种骚操作如何用python实现
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: wLsq PS:如有需要Python学习资料的小伙伴可以加点击下方链 ...
- python嵌套列表知多少
今天在创建嵌套列表时遇到一个问题,决定看看到底是谁在背后捣鬼 >>> board1 = [[0]*3 for _ in range(3)] [[0, 0, 0], [0, 0, 0] ...
- 数据类型、运算符、Scanner的使用
一.常见的基本数据类型 数值型 byte(最小,2字节) short(4字节) int (默认 8字节) long(16字节) 浮点型 f ...
- Centos史上新版最详细步骤-Linux无脑命令式oracle11g静默安装
1. 关闭selinux 1.1 sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config 1.2 或者 ...
- 2019-2020-1 20199325《Linux内核原理与分析》第五周作业
第五周作业主要是选择一个系统调用(13号系统调用time除外),使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用,在实验楼Linux虚拟机环境下完成实验. 系统调用的列表参见 http ...
- 在Spring Boot中加载初始化数据
文章目录 依赖条件 data.sql文件 schema.sql 文件 @sql注解 @SqlConfig 注解 在Spring Boot中加载初始化数据 在Spring Boot中,Spring Bo ...
- js 函数对象的继承 inherit 带 插件完整解析版[helpers.js]
前言: 本人纯小白一个,有很多地方理解的没有各位大牛那么透彻,如有错误,请各位大牛指出斧正!小弟感激不尽. 本篇文章为您分析一下原生JS的对象继承方法 需求分析: 1. ...
- ip地址与运算 ipcalc命令
http://man.linuxde.net/ipcalc 转载于:https://blog.51cto.com/sonlich/2064133
- winform练习-通过遍历Control容器中的对象统一委托事件-楼盘选择器
1.窗体布局如下,一个label标签内容如下,一个btnSave按钮,用于保存,其他九个按钮用于选择楼盘. 2. 按钮存于Control容器中,编写方法遍历容器中的button,通过条件过滤掉不是bu ...