当前位置: 首页 > news >正文

自适应网站制作方案网站的建站程序

自适应网站制作方案,网站的建站程序,中山网约车资格证报名地点,青岛网络公司哪家专业想要精通算法和SQL的成长之路 - 验证二叉树 前言一. 验证二叉树1.1 并查集1.2 入度以及边数检查 前言 想要精通算法和SQL的成长之路 - 系列导航 并查集的运用 一. 验证二叉树 原题链接 思路如下: 对于一颗二叉树,我们需要做哪些校验? 首先…

想要精通算法和SQL的成长之路 - 验证二叉树

  • 前言
  • 一. 验证二叉树
    • 1.1 并查集
    • 1.2 入度以及边数检查

前言

想要精通算法和SQL的成长之路 - 系列导航
并查集的运用

一. 验证二叉树

原题链接
在这里插入图片描述
思路如下:

  1. 对于一颗二叉树,我们需要做哪些校验?

  2. 首先这颗树不可以成环,如图:
    在这里插入图片描述

  3. 其次,这颗树的边数量,应该等于 n -1。如下图就是错的:
    在这里插入图片描述

  4. 存在一个根节点,它的入度为0,其他所有的节点,入度都不能够超过1。

那么针对以上几点,我们可以分别来考虑。我们同时遍历一次左右节点数组。值不是-1的话,说明该端连接的节点非空。

  • 我们用一个int[] inDegree数组代表入度。对应值非-1的时候,入度加1。
  • 用一个edges变量代表无向边数,只要值非-1,变数+1。
  • 同时在遍历的过程中,针对值非-1的情况,我们将左右两端的节点进行合并。这一块使用并查集数据结构。最终合并完之后,根节点数应该只有一个。

那么我们先写并查集的数据结构。

1.1 并查集

class UnionFind {private int[] parent;private int[] rank;private int sum;public UnionFind(int n) {rank = new int[n];parent = new int[n];// 初始化,每个节点的根节点指向其本身for (int i = 0; i < n; i++) {parent[i] = i;}// 这里指的是根节点数量sum = n;}public int find(int x) {while (x != parent[x]) {x = parent[x];}return x;}public void union(int x, int y) {int rootX = find(x);int rootY = find(y);// 如果两个元素的根节点一致,不需要合并if (rootX == rootY) {return;}// 如果根节点 rootX 的深度 > rootY。if (rank[rootX] > rank[rootY]) {// 那么将以rootY作为根节点的集合加入到rootX对应的集合当中rank[rootX] += rank[rootY];// 同时改变rootY的根节点,指向rootX。parent[rootY] = rootX;} else {// 反之rank[rootY] += rank[rootX];parent[rootX] = rootY;}sum--;}
}

1.2 入度以及边数检查

public boolean validateBinaryTreeNodes(int n, int[] leftChild, int[] rightChild) {int[] inDegree = new int[n];UnionFind unionFind = new UnionFind(n);// 边数int edges = 0;for (int i = 0; i < n; i++) {int left = leftChild[i];int right = rightChild[i];if (left != -1) {// 入度数+1,并且合并左右两端。同时边数+1inDegree[left]++;unionFind.union(i, left);edges++;}if (right != -1) {inDegree[right]++;unionFind.union(i, right);edges++;}}// 判断边数是否等于 n -1 if (edges != n - 1) {return false;}// 判断入度数是否都是 <=1,这里统计入度数 > 1的节点个数int count = 0;for (int i = 0; i < n; i++) {if (inDegree[i] > 1) {count++;}}// 不该存在入度数 >1 的节点,如果存在,返回falseif (count > 0) {return false;}// 判断是否存在环,此时根节点只能存在一个return unionFind.sum == 1;
}

最终代码如下:

public class Test1361 {public boolean validateBinaryTreeNodes(int n, int[] leftChild, int[] rightChild) {int[] inDegree = new int[n];UnionFind unionFind = new UnionFind(n);int edges = 0;for (int i = 0; i < n; i++) {int left = leftChild[i];int right = rightChild[i];if (left != -1) {inDegree[left]++;unionFind.union(i, left);edges++;}if (right != -1) {inDegree[right]++;unionFind.union(i, right);edges++;}}// 判断边数是否相等if (edges != n - 1) {return false;}// 判断入度数是否都是 <=1int count = 0;for (int i = 0; i < n; i++) {if (inDegree[i] > 1) {count++;}}if (count > 0) {return false;}// 判断是否存在环return unionFind.sum == 1;}class UnionFind {private int[] parent;private int[] rank;private int sum;public UnionFind(int n) {rank = new int[n];parent = new int[n];for (int i = 0; i < n; i++) {parent[i] = i;}sum = n;}public int find(int x) {while (x != parent[x]) {x = parent[x];}return x;}public void union(int x, int y) {int rootX = find(x);int rootY = find(y);// 如果两个元素的根节点一致,不需要合并if (rootX == rootY) {return;}// 如果根节点 rootX 的深度 > rootY。if (rank[rootX] > rank[rootY]) {// 那么将以rootY作为根节点的集合加入到rootX对应的集合当中rank[rootX] += rank[rootY];// 同时改变rootY的根节点,指向rootX。parent[rootY] = rootX;} else {// 反之rank[rootY] += rank[rootX];parent[rootX] = rootY;}sum--;}}
}
http://www.yayakq.cn/news/269374/

相关文章:

  • 怎么用vscode做网站wordpress根目录403
  • 龙南黄页全部电话做seo需要会网站开发吗
  • 网站备案号怎么查上海58同城官网
  • 域名备案掉了网站还可以用免费的制作网站
  • 医院网站绿色模板光效网站
  • 深圳建网站seo页面设计平台
  • 公司网站开发策划推广普通话手抄报图片
  • 素马杭州网站设计介绍网站备案中查询
  • 孝感市门户网站个人如何做网站
  • 一个网站的域名突然换了阳信住房和城乡建设厅网站
  • 网站建设维护费一年多少钱网约车平台
  • 商务网站规划与建设心得商业空间设计书籍
  • app公司网站建设价格外贸网站推广上海
  • 内江市建设培训中心网站室内设计软件免费下载
  • 十大纯净系统网站门户网站的发布特点
  • 山东住房和城乡建设厅网站教育中心动易 手机网站
  • 行业网站策划方案夹娃娃网站如何做
  • 自己做的视频网站如何赚钱吗中国纪检监察网站首页
  • 网站建设 内容蚌埠市做网站
  • 如何利用淘宝建设网站挣钱免费网站登陆模板
  • 网站设置的流程第一步应该wordpress 中文主题
  • 佛山市网站公司阿里服务器可以做多少个网站
  • 网站例子北京seo网络优化招聘网
  • 阜阳做网站哪家好开发商逾期交房怎么赔偿
  • 比较有设计感的网站快递查询网站建设
  • 中小企业做网站推广有哪些网站做的很好
  • 企业网站的总体设计网站开发主页
  • 设计师必看的10个网站制作网页教程的方法
  • 搜索网站定制公司聊城手机网站
  • 哪个网站可以做制图兼职apsx做的网站怎么发布