-
叶子节点
2019-07-04 16:42:23 -
mysql 叶子节点_MySQL 树形结构 根据指定节点获取其所有叶子节点
2021-01-19 05:17:26背景说明需求:MySQL树形结构, 根据指定的节点,获取其下属的所有叶子节点。叶子节点:如果一个节点下不再有子节点,则为叶子节点。问题分析1、可以使用类似Java这种面向对象的语言,对节点集合进行逻辑处理,获取...背景说明
需求:MySQL树形结构, 根据指定的节点,获取其下属的所有叶子节点。
叶子节点:如果一个节点下不再有子节点,则为叶子节点。
问题分析
1、可以使用类似Java这种面向对象的语言,对节点集合进行逻辑处理,获取叶子节点。
2、直接自定义MySQL函数 getLeafNodeList,通过两层while循环,实现对指定节点的所有叶子节点进行查询。
功能实现
1、创建数据表
1)表结构截图如下(此处简单建一张表t_tree,id主键自增,uuid表示本节点,parent_uuid表示父节点):
2)建表语句如下:
/*Navicat Premium Data Transfer
Source Server : localhost
Source Server Type : MySQL
Source Server Version : 50724
Source Host : localhost:3306
Source Schema : test_db
Target Server Type : MySQL
Target Server Version : 50724
File Encoding : 65001
Date: 07/05/2019 21:04:57*/
SETNAMES utf8mb4;SET FOREIGN_KEY_CHECKS = 0;--------------------------------Table structure for t_tree------------------------------
DROP TABLE IF EXISTS`t_tree`;CREATE TABLE`t_tree` (
`id`int(20) NOT NULLAUTO_INCREMENT,
`uuid`int(20) NULL DEFAULT NULL,
`parent_uuid`int(20) NULL DEFAULT NULL,PRIMARY KEY(`id`) USING BTREE
) ENGINE= InnoDB AUTO_INCREMENT = 14 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT =Dynamic;--------------------------------Records of t_tree------------------------------
INSERT INTO `t_tree` VALUES (1, 1, 0);INSERT INTO `t_tree` VALUES (2, 2, 0);INSERT INTO `t_tree` VALUES (3, 3, 0);INSERT INTO `t_tree` VALUES (4, 11, 1);INSERT INTO `t_tree` VALUES (5, 12, 1);INSERT INTO `t_tree` VALUES (6, 21, 2);INSERT INTO `t_tree` VALUES (7, 22, 2);INSERT INTO `t_tree` VALUES (8, 211, 21);INSERT INTO `t_tree` VALUES (9, 221, 22);INSERT INTO `t_tree` VALUES (10, 222, 22);INSERT INTO `t_tree` VALUES (11, 223, 22);INSERT INTO `t_tree` VALUES (12, 2231, 223);INSERT INTO `t_tree` VALUES (13, 2232, 223);SET FOREIGN_KEY_CHECKS = 1;
3)表数据结构如下:
4)树形结构如下图:
2、编写查询叶子节点函数 getLeafNodeList,如下:
CREATE DEFINER=`root`@`localhost` FUNCTION `getLeafNodeList`(`nodeId` int) RETURNS varchar(1000) CHARSET utf8BEGIN
DECLARE leafNodeList VARCHAR(1000); # 返回叶子节点结果集DECLARE tempChild VARCHAR(1000); # 临时存放子节点DECLARE count int; # 计算节点下是否有节点,count = 0表示为叶子节点DECLARE tempLeaf VARCHAR(1000); # 临时存放可能的叶子节点DECLARE leafNode VARCHAR(1000); # 存放叶子节点SET leafNodeList = ‘‘;SET tempChild = CAST(nodeId as CHAR); # 将int类型转换为String类型WHILE tempChild is not nullDO # 外层循环,用于查询节点下所有的子节点SET tempLeaf =tempChild; # 临时存放节点,用于内层循环判定是否为叶子节点,避免影响外层循环使用 tempChildWHILE LENGTH(tempLeaf) > 0DO # 内层循环,用于判断外层查询到的子节点是否为叶子节点SET leafNode = SUBSTRING_INDEX(tempLeaf, ‘,‘, 1); # 假定逗号分隔的第一个为叶子节点select count(uuid) INTO count from t_tree where parent_uuid =tempLeaf; # 查询该节点下是否有子节点IF count = 0 THEN
SET leafNodeList = CONCAT(leafNodeList, ‘,‘, leafNode); # 如果该节点下没有子节点,则认为是叶子节点,存入到返回结果中END IF;SET tempLeaf = SUBSTRING(tempLeaf, LENGTH(leafNode) + 2); # 将第一个节点截取掉,继续识别剩余的节点END WHILE;SELECT GROUP_CONCAT(uuid) INTO tempChild FROM t_tree where FIND_IN_SET(parent_uuid, tempChild) > 0; # 查询节点下所有子节点END WHILE;RETURN SUBSTRING(leafNodeList, 2); # 将返回结果进行处理,截取掉结果集前面的逗号END
其中,用到了很多MySQL的系统函数,如:CAST,SUBSTRING,SUBSTRING_INDEX,CONCAT,GROUP_CONCAT,FIND_IN_SET。
3、调用函数
select getLeafNodeList(1) as leafNodeList;
0)查询节点0 的叶子节点:从树形图可以看到,叶子节点应该是3,11,12,211,221,222,2231,2232
1)查询节点1 的叶子节点:从树形图可以看到,叶子节点应该是11,12
2)查询节点2 的叶子节点:从树形图可以看到,叶子节点应该是211,221,222,2231,2232
3)查询节点3 的叶子节点:从树形图可以看到,叶子节点应该是3
问题总结
该问题核心点是内层循环查找叶子节点,按照上面的表数据和截图,阅读SQL函数,很好理解。
希望能帮到需要帮助的同行,谢谢。
PS:
如果需要 根据指定的节点,获取其下属的所有子节点(包含路径上的所有枝干节点和叶子节点)。
请参考本人的另一篇博文:
原文:https://www.cnblogs.com/miracle-luna/p/10828476.html
-
java求叶子节点个数_求二叉树中叶子节点的个数
2021-03-14 17:30:02求二叉树中叶子节点的个数面试题二叉树题目描述求二叉树中叶子节点的个数。叶子节点的定义:如果一个节点既没有左孩子,也没有右孩子,则该节点为叶子节点。示例:3/ \9 20/ \15 7在这个二叉树中,叶子节点有 9,15,7,...求二叉树中叶子节点的个数
面试题二叉树
题目描述
求二叉树中叶子节点的个数。
叶子节点的定义:如果一个节点既没有左孩子,也没有右孩子,则该节点为叶子节点。
示例:
3
/ \
9 20
/ \
15 7
在这个二叉树中,叶子节点有 9,15,7,所以返回 3。
Java 实现
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
class Solution {
public int getLeafCount(TreeNode root) {
if (root == null) {
return 0;
}
if (root.left == null && root.right == null) {
// 输出叶子节点
System.out.println("leaf nodes:" + root.val);
return 1;
}
return getLeafCount(root.left) + getLeafCount(root.right);
}
}
public class Test {
public static void main(String[] args) {
Solution tree = new Solution();
/* create a tree */
TreeNode root = new TreeNode(3);
root.left = new TreeNode(9);
root.right = new TreeNode(20);
root.right.left = new TreeNode(15);
root.right.right = new TreeNode(7);
System.out.println(tree.getLeafCount(root));
}
}
运行结果
leaf nodes:9
leaf nodes:15
leaf nodes:7
3
相似题目
参考资料
-
java 叶子节点计算_Java实现 LeetCode 129 求根到叶子节点数字之和
2021-02-25 19:38:34129. 求根到叶子节点数字之和给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。例如,从根到叶子节点路径 1->2->3 代表数字 123。计算从根到叶子节点生成的所有...129. 求根到叶子节点数字之和
给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。
例如,从根到叶子节点路径 1->2->3 代表数字 123。
计算从根到叶子节点生成的所有数字之和。
说明: 叶子节点是指没有子节点的节点。
示例 1:
输入: [1,2,3]
1
/ \
2 3
输出: 25
解释:
从根到叶子节点路径 1->2 代表数字 12.
从根到叶子节点路径 1->3 代表数字 13.
因此,数字总和 = 12 + 13 = 25.
示例 2:
输入: [4,9,0,5,1]
4
/ \
9 0
/ \
5 1
输出: 1026
解释:
从根到叶子节点路径 4->9->5 代表数字 495.
从根到叶子节点路径 4->9->1 代表数字 491.
从根到叶子节点路径 4->0 代表数字 40.
因此,数字总和 = 495 + 491 + 40 = 1026.
class Solution {
static int sum;
public int sumNumbers(TreeNode root) {
sum = 0;
childSum(0, root);
return sum;
}
public static void childSum(int val, TreeNode root) {
if(root == null) return;
int k = (val * 10 + root.val) ;
if(root.left == null && root.right == null) {
sum += k;
}
childSum(k, root.left);
childSum(k, root.right);
}
}
-
二叉树 求叶子节点数并返回叶子节点个数
2019-05-27 16:51:05需要先构造一个二叉树,再对二叉树进行遍历,遍历到叶子节点就输出和个数+1 二叉树的结点类: package com.alibaba.structure.school.two; // 节点类 public class BinaryNode<T> { public T data; ... -
java根节点到叶子节点_leetcode129(求根到叶子节点数字之和)--Java语言实现
2021-03-10 10:19:41求:给定一个二叉树,它的每个结点都存放一个0-9的数字,每条从根到叶子节点的路径都代表一个数字。例如,从根到叶子节点路径 1->2->3 代表数字 123。计算从根到叶子节点生成的所有数字之和。说明:叶子节点是... -
根节点、子节点、叶子节点是什么?
2020-11-25 00:12:09下面给个例子图解释(根节点、子节点、叶子节点)。 上图数字 1、3、7是叶子节点;(因为他们下面没有分叉出子节点,所以称为:叶子节点)【度为0】 数字2、8是子节点; (除了根节点、叶子节点之外的,都称为:... -
每个叶子节点(nil)是黑色。_129. 求根到叶子节点数字之和
2020-11-24 11:00:42129. 求根到叶子节点数字之和给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。例如,从根到叶子节点路径 1->2->3 代表数字 123。计算从根到叶子节点生成的所有... -
输出二叉树叶子节点、叶子节点数目、二叉树高度
2014-09-22 22:58:46#include/*输出二叉树叶子节点、叶子节点数目、二叉树高度*/ #include typedef int DataType; int count=0;//用于统计叶子节点的数目// typedef struct Node { DataType data; struct Node *LChild; ... -
叶子结点和分支节点_什么是叶子节点,度?根节点?
2020-12-24 03:40:35展开全部1、叶子也就是...叶子节点就是树中最底段的节点,叶子节点没有子节点。格式化叶子节点的结构比中间节点的结构稍微复杂一点。2、度为0的结点叫叶子结点。3、处在树的最顶端(没有双亲)的结点叫根结点。4、该... -
D. Edge Weight Assignment(贪心、叶子节点深度计算、兄弟叶子节点计数)
2020-04-13 15:12:08最少:如果两个叶子节点的距离是偶数,那么对于这条路我们只需要放一种数字,异或就是0,如果距离是奇数n,那么我们就要放三种数字,n-2个主要数字,剩下两个数字的异或为那个主要数字,这样异或的结果也为0,所以... -
根节点、子节点,以及叶子节点的区别
2018-11-27 21:00:37所谓的树形结构就是各个元素之间具有分层关系的数据结构,常用一棵倒置的树来表示逻辑关系。 所谓的根节点就是树的最顶端的节点, 继续往下分为子节点, ...当不断细分直到不再有子节点时为叶子节点。... -
求满二叉树(哈夫曼树)叶子节点和非叶子节点的数目
2015-04-17 12:13:420)个节点的满二叉树共有几个叶子节点和非叶子节点?请写出解题过程 方法有两种:设有x个叶子节点和y个非叶子节点 法一:若该该二叉树有k层(k>0),则 第一层有一个节点、 第二层有两个节点 第三... -
搜狐研究院 求二叉树最大叶子节点到最小叶子节点的距离
2017-06-04 22:27:17先求最大最小叶子节点,再求两节点的LCA(最近公共祖先),求两节点到LCA距离。 import java.util.*; /* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public ... -
二叉树根节点到叶子节点路径问题
2020-05-19 16:53:16关于二叉树根节点到叶子节点路径问题,最容易想到的就是打印二叉树所有根节点到叶子节点的路径。这个很容易,就是以二叉树的前序遍历为基础,在遍历过程中记录遍历的节点然后碰到叶子节点就输出结果。代码如下: ... -
二叉树根节点到叶子节点的所有路径和
2020-09-25 20:25:52二叉树根节点到叶子节点的所有路径和 题目描述 给定一个仅包含数字 0−9\ 0-9 0−9 的二叉树,每一条从根节点到叶子节点的路径都可以用一个数字表示。 例如根节点到叶子节点的一条路径是1→2→31\to 2\to 31→2→3,... -
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。
2020-03-11 11:51:02二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 示例: 给定二叉树 [3,9,20,null,null,15,7], 返回它的最大深度 3 。 2.代码展示 /** * Definition for a ... -
pytorch 张量 叶子节点说明
2020-10-25 10:47:49pytorch中,叶子节点是用来进行优化的变量,所以只有在requires_grad=True的时候才有讨论的意义。 只有生成的张量才能是叶子节点,只要经过了运算,就不是叶子节点了。包括normalize, 改变某个位置的数值等等 ... -
lee129 根节点到叶子节点数字之和
2020-03-29 15:00:49lee129 根节点到叶子节点数字和 给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。 例如,从根到叶子节点路径 1->2->3 代表数字 123。 计算从根到叶子节点生成的... -
数据结构与算法-知道树的某几个叶子节点,将所有包含该叶子节点的路径组成一颗新的树
2020-04-04 16:46:13上一次记录博客是过年之前,太久了。...对于每一个叶子节点来说,如果已知的叶子节点包含这个叶子节点,那么给标记为true。 对于非叶子节点来说,如果子节点中有一个标记为true,那么该节点标记为tr... -
根据树和节点的度计算叶子节点数
2020-02-12 14:51:41根据树和节点的度计算叶子节点数 问题: 设树T的度为4,其中度为1,2,3,4的节点个数分别为4,2,1,1,则树T中叶子节点数为? 节点的度和总节点数有如下关系: n = m+1, #n是总节点数,m是节点度的和 树的深度和总结点数... -
递归求二叉树叶子节点和
2020-06-22 14:47:17使用递归解决此类问题,可以首先分析问题及其拆解,这里面可以将求叶子节点的和拆解为求左子树叶子节点和与求右子树的叶子节点和,然后分析递归出口,这里即访问到叶子节点退出,返回叶子节点本身的值。 class ... -
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明: 叶子节点是指没有子节点的节点。
2018-09-07 00:43:17最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明: 叶子节点是指没有子节点的节点。 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * ... -
获取树的叶子节点
2020-11-24 15:55:48ArrayList,List遍历获取叶子节点 注意:只获取叶子节点,枝节点是不获取的. private List<HelpCenterTitleDto> get3Child(HelpCenterTitleDto helpCenterTitleDto) { List<HelpCenterTitleDto> list = ... -
LC-二叉树根节点到叶子节点的所有路径和
2020-10-26 23:02:45二叉树根节点到叶子节点的所有路径和 //二叉树根节点到叶子节点的所有路径和 /* 给定一个仅包含数字 0−9\ 0-9 0−9 的二叉树,每一条从根节点到叶子节点的路径都可以用一个数字表示。 例如根节点到叶子节点的一条... -
求叶子节点的个数
2019-12-01 22:10:30//求叶子节点个数 //借助遍历,访问节点时,先判断是否为叶子节点 public int leafsize = 0; public int getLeafsize(Node root) { if(root == null) { return 0; } if(root.left == null... -
2-3树 叶子节点删除
2020-04-18 21:10:35本文不再阐述关于2-3树的定义、节点的插入以及将删除的非叶子节点转换为叶子节点的方法 注意: 本文仅对2-3树 叶子节点的 删除操作 进行分类与讨论 定义: 2-节点: 如果某个节点包含1个权值, 那么我们称之为2-节点, ...