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 访问. 不使用任何内建的哈希表库设计一个哈希集合 具体地说 ...
随机推荐
- 程序员小张的第一篇博文 --记Markdown的使用学习
1.前言 为了即将到来的面试做准备,以及记录一下平日里自己的学习过程和生活日常,我开始进驻博客园啦!这就是我的第一篇博客(有点小激动)~ 作为一只新手,首先记录一下今晚的编写博文的学习过程吧~ 2.使 ...
- Delphi程序启动参数的读取
Delphi中有两个专门用于读取命令行参数的变量: Paramcount-->用于返回命令行参数的个数 Paramstr数组-->用于返回指定的命令行参数 示例代码 ...
- 如何用python无账号无限制获取企查查信息
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http ...
- G. 平行线
单点时限: 2.0 sec 内存限制: 512 MB “大猩猩为什么不喜欢平行线?”“因为平行线没有相交”哈哈哈哈哈哈哈哈哈 为了管理动物园不听话的大猩猩们,动物管理员Boctorio 决定去远方的A ...
- # Unity 游戏框架搭建 2019 (三十四、三十五) 9 ~ 10 示例整理
第九个示例 目前代码如下: using UnityEngine; #if UNITY_EDITOR using UnityEditor; #endif namespace QFramework { p ...
- PHP反序列化漏洞总结(二)
写在前边 之前介绍了什么是序列化和反序列化,顺便演示了一个简单的反序列化漏洞,现在结合实战,开始填坑 前篇:https://www.cnblogs.com/Lee-404/p/12771032.htm ...
- Java 多线程 -- volatile 山寨版的synchronized
在 多线程中,每个线程会把数据从主内存中拷贝到自己的工作内存中,当线程完成计算后,再把工作内存的数据更新到主内存中,或者当主内存主数据有更新是,线程会去主内存取最新数据.但是,当线程特别忙时,就不会去 ...
- <string>头文件常用成员函数
之前说过 string和vector一样,也是一种顺序容器,并且它也自带成员函数,用法和vector的成员函数差不多,不过它只能用来存放字符,也就是字符串. 在c++中,<string>基 ...
- thinkphp5 csv格式导入导出(多数据处理)
关于csv文件格式的导出导入个人见解 先上代码: <?php namespace think; class Csv { /** * 导出csv文件 * @param $list 数据源 * @p ...
- tp5 -- 控制器的参数
方法的参数是可以直接获取的到get和post这集中提交格式的数据的. 但是呢. 前置操作时不能这样操作的, 只能老老实实的使用input()这个方法来获取!!!