题目描述:

二叉树上有 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、哈希集合)的更多相关文章

  1. 哈希集合——hashSet

    /**     哈希集合特点:存取顺序不确定,同一个哈希值的位置可以存放多个元素,                   哈希集合存放元素的时候是先判断哈希地址值:hashCode()是否相同,如果不同 ...

  2. UVA 10651 Pebble Solitaire(bfs + 哈希判重(记忆化搜索?))

    Problem A Pebble Solitaire Input: standard input Output: standard output Time Limit: 1 second Pebble ...

  3. [Swift]LeetCode705. 设计哈希集合 | Design HashSet

    Design a HashSet without using any built-in hash table libraries. To be specific, your design should ...

  4. [TimLinux] Python __hash__ 可哈希集合

    规则: __hash__ 应该返回一个整数,hash()函数计算基础类型的hash值 可哈希集合:set(), forzenset(), dict() 三种数据结构操作要求 key 值唯一,判断唯一的 ...

  5. LeetCode 705:设计哈希集合 Design HashSet

    题目: 不使用任何内建的哈希表库设计一个哈希集合 具体地说,你的设计应该包含以下的功能 add(value):向哈希集合中插入一个值. contains(value) :返回哈希集合中是否存在这个值. ...

  6. C#泛型集合之——哈希集合

    1.特点:HashSet 中元素不重复,容量为元素个数,自动增大.是一组值,是高性能的数学集合. 2.创建: (1)HashSet<类型> 集合名 = new HashSet<类型& ...

  7. Leetcode705.Design HashSet设置哈希集合

    不使用任何内建的哈希表库设计一个哈希集合 具体地说,你的设计应该包含以下的功能 add(value):向哈希集合中插入一个值. contains(value) :返回哈希集合中是否存在这个值. rem ...

  8. Java实现 LeetCode 705 设计哈希集合(使用数组保存有没有被用过)

    705. 设计哈希集合 不使用任何内建的哈希表库设计一个哈希集合 具体地说,你的设计应该包含以下的功能 add(value):向哈希集合中插入一个值. contains(value) :返回哈希集合中 ...

  9. C#LeetCode刷题之#705-设计哈希集合​​​​​​​(Design HashSet)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4114 访问. 不使用任何内建的哈希表库设计一个哈希集合 具体地说 ...

随机推荐

  1. SpringCloud系列之网关(Gateway)应用篇

    @ 目录 前言 项目版本 网关访问 鉴权配置 限流配置 前言 由于项目采用了微服务架构,业务功能都在相应各自的模块中,每个业务模块都是以独立的项目运行着,对外提供各自的服务接口,如没有类似网关之类组件 ...

  2. stand up meeting 1/11/2016

    part 组员                工作              工作耗时/h 明日计划 工作耗时/h    UI 冯晓云 跑通打印机功能,尝试与pdf读取部分结合;生词本卡片选择简略释义 ...

  3. windows批处理protoc生成C++代码

    1 首先需要生成protoc的可执行文件,具体可以参考  https://www.cnblogs.com/cnxkey/articles/10152646.html 2 将单个protoc文件生成.h ...

  4. css特效sh

    1   opacity=0.5:                                                             透明度 2    选择器   .btn1:ho ...

  5. python之elasticsearch查询

    下载所需模块 python安装好的情况下,通过pip install elasticsearch进行es模块的安装 安装完成后通过pip list命中查询 导入模块 from elasticsearc ...

  6. kubernetes的cni0和flannel.1的关系?

    当容器运行之后,节点之间多了个虚拟接口cni0,它是由flanneld创建的一个虚拟网桥叫cni0,供pod本地通信使用.flanneld为每个pod创建一对veth虚拟设备,一端放在容器接口上,一端 ...

  7. 手机app测试用例怎么写?手机app测试点有哪些?只有干货没有水分,错过绝对后悔!

    一.前言    在当今竞争激烈的市场上一个APP的成功离不开一个可靠的测试工程师.因此,对功能和用户体验有特殊关注的App进行全面测试是必不可少的.如何做到测试用例的百分百覆盖一直是测试用例编写过程中 ...

  8. 引导 ARM Linux

    引导 ARM Linux 本文翻译自:https://www.kernel.org/doc/html/latest/arm/booting.html 引导 ARM Linux 需要一个引导加载程序,它 ...

  9. Hadoop的下载和安装

    Hadoop的下载和安装 一:Hadoop的简介 Apache的Hadoop是一个开源的.可靠的.可扩展的系统架构,可利用分布式架构来存储海量数据,以及实现分布式的计算. Hadoop许使用简单的编程 ...

  10. 【三剑客】awk函数

    1. 内置函数 awk的内置函数有算术.字符串.时间.位操作和其它杂项的函数. 1.1 算术函数 atan2(y,x)  返回弧度的反正切(y/x) cos(expr)  返回expr的余弦(以弧度形 ...