当前位置: 首页 > 面试题库 >

MySQL:如何在特定节点中查找叶子

苏畅
2023-03-14
问题内容

我知道这类问题已经在这里多次发布,例如:Java方式

我在标准树模式的数据量庞大(150K +)( , id,)parent_id``some_data

问题: 如何获取给定node_id的叶子?

表结构:

CREATE TABLE `DATA_TREE` (
  `ID` int(11) NOT NULL,
  `PARENT_ID` int(11) NOT NULL,
  `DATA` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`ID`),
  UNIQUE KEY `ID_UNIQUE` (`ID`),
  KEY `fk_DATA_TREE_1_idx` (`PARENT_ID`),
  CONSTRAINT `fk_DATA_TREE_1` FOREIGN KEY (`PARENT_ID`) REFERENCES `DATA_TREE` (`ID`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf

数据库: MySQL 5.1.61


问题答案:

无法在单个查询中执行此操作。即使有,它也可能效率很低。

我们可以通过存储过程和循环来实现。使用添加的索引,它也应该很快。这使用两个表从输入表(A)中选择节点,并将该节点及其子级插入(B)。然后,它将B交换为A,并重复执行直到直到A中不再存在非叶节点为止。可喜的是,循环迭代的数量将与输入节点和最后一个叶节点之间的级别一样多,在大多数情况下,循环迭代次数为可能没有那么深。此存储过程比在代码中进行外部存储过程要快。

仅供参考,我在安装临时表时遇到了困难,如果遇到“错误2”,请删除临时关键字。

delimiter $$
drop procedure if exists GetLeafNodes $$
create procedure GetLeafNodes(nodeid int)
begin
declare N int default 1;

-- create two working sets of IDs, we'll go back and forth between these two sets
drop temporary table if exists A;
drop temporary table if exists B;
create temporary table A(node int, child int);
create temporary table B(node int, child int);

-- insert our single input node into the working set
insert into A values (null, nodeid);

while (N>0) do
  -- keep selecting child nodes for each node we are now tracking
  -- leaf nodes will end up with the child set to null
  insert into B
  select ifnull(A.child,A.node), tree.ID
    from A
    left outer join DATA_TREE as tree on A.child=tree.parent_id;

  -- now swap A and B
  rename table A to temp, B to A, temp to B;

  -- remove non-leaf nodes from table B
  delete from B;

  -- exit when there are no longer any non-leaf nodes in A
  set N=(select count(*) from A where child is not null);
end while;

-- now output our list of leaf nodes
select node from A;

drop temporary table A;
drop temporary table B;
end $$
DELIMITER ;
call GetLeafNodes(4);

我使用以下样本集进行测试:

CREATE TABLE `DATA_TREE` (
  `ID` int(11) NOT NULL,
  `PARENT_ID` int(11) NOT NULL,
  PRIMARY KEY (`ID`),
  UNIQUE KEY `ID_UNIQUE` (`ID`),
  KEY `fk_DATA_TREE_1_idx` (`PARENT_ID`)
) ENGINE=InnoDB
;

insert into DATA_TREE values
(1,0),(2,1),(3,1),(4,1),(5,3),(6,3),(7,4),(8,4),(9,4),(10,6),(11,6),(12,7),(13,9),(14,9),(15,12),(16,12),(17,12),(18,14);


 类似资料:
  • 我正在尝试解决以下算法: 您有一棵n元树。找到满足以下条件的所有节点: < li >该节点有子节点,但所有子节点都是叶节点(它们没有子节点)。返回仅叶父节点的列表及其在树中的深度。 因此,如果我有下面的树,唯一满足上述条件的节点是D,因为它有子节点(E),但它们没有子节点。 我试图在Java中实现这一点,但伪代码也适用于我。我在这里实现了树和节点结构:Java中的N元树。 我需要的只是算法。

  • 问题内容: 我想获取所有属于以下子项的标签: 我知道如何找到像这样的特定类的元素: 但是我不知道如何找到所有的孩子,而不是其他孩子。 就像我想选择: 问题答案: 尝试这个

  • 问题内容: 我使用以下各列来运行磨机嵌套集层次结构类型设置: 表名: 列: 有谁知道查询以确定节点的 父级 ? 我读了几个地方,在表中也有一个 parent_id 列来跟踪它很方便,但是它看起来很多余,而且如果添加/时查询执行不正确,它似乎可能与嵌套集不同步删除/移动集合中的任何内容。 问题答案: 看这个问题。它与您的相似。我在那里发布了您可能需要的查询。 希望您有需要。 对于下表: 它产生输出:

  • 我需要检查节点是否是二叉树中的叶子。这是我当前的代码。 它向我发送了一条错误消息:“HW371937.hs:C:\Users\lenovo\Desktop\���\��� HASKELL\hw371937。hs:(22,1)-(25,91):函数isLeaf中的非穷举模式” 我不知道如何递归地检查下一个节点是否是叶子。任何帮助都将受到感谢。

  • 在二叉树的morris遍历中,它使用每个右叶节点建立指向当前节点的连接。 假设我们以预先排序的方式遍历树,当到达叶节点时,我们如何判断是否遇到叶节点? 我们不能使用下面的行来检查:if(null==node.left 因为这里node.right指向当前节点,因为莫里斯算法。 一个好方法是,我们总是使用TreeNode对象中的一个字段将访问的节点标记为已访问,但是如果我们没有这个字段,在许多情况下

  • 问题内容: 我正在使用Selenium来测试我的Web应用程序,并且可以使用成功找到标签。但是,我时不时需要在该节点内找到子节点。 例: 我可以: 但是现在我需要找到输入,所以我可以这样做: 但是,到那时,我只拥有了代码,不再具有xpath了……我想做这样的事情: 但是这种功能不存在。我可以这样做吗? 顺便说一句:有时我需要找到一个具有一定下降节点的。如何在xpath中询问“ 包含带有文本的”?