使用SQL,我想跟随树结构直到最后一页。树= 1和结= 2;树= 1和结= 3;树= 1和结=空(累积概率);树= 2和结4 =树= 2和结= 5;树= 2和结是空(累积概率);树= 3和结= 6;树= 3和结是空(累积概率);树= 4和结是空(累积概率);树= 5并且结是空(累积概率);树= 6并且结是空(累积概率);查找树的高度
Q
查找树的高度
-1
A
回答
0
如果组织这样的数据,你可以做以下
with TREETAB as (
select '1' treenode, '2' nodeval from dual
union all
select '1' treenode, '3' nodeval from dual
union all
select '1' treenode, 'leaf1' nodeval from dual
union all
select '2' treenode, '4' nodeval from dual
union all
select '2' treenode, '5' nodeval from dual
union all
select '2' treenode, 'leaf2' nodeval from dual
union all
select '3' treenode, '4' nodeval from dual
union all
select '3' treenode, 'leaf3' nodeval from dual
union all
select '4' treenode, 'leaf4' nodeval from dual
union all
select '5' treenode, 'leaf5' nodeval from dual
union all
select '6' treenode, 'leaf6' nodeval from dual
)
select *
from (SELECT t.*, CONNECT_BY_ISLEAF Leaf,
SYS_CONNECT_BY_PATH(nodeval, '/') "Path", level
FROM TREETAB t
start with t.treenode = 1
CONNECT BY PRIOR t.nodeval = to_char(t.treenode))
where Leaf = 1
order by treenode;
如果不需要对树,叶和路径的详细信息,你可以只检查什么也没有同等价值treenode
为nodeval
这样
with TREETAB as
(select '1' treenode, '2' nodeval
from dual
union all
select '1' treenode, '3' nodeval
from dual
union all
select '1' treenode, 'leaf1' nodeval
from dual
union all
select '2' treenode, '4' nodeval
from dual
union all
select '2' treenode, '5' nodeval
from dual
union all
select '2' treenode, 'leaf2' nodeval
from dual
union all
select '3' treenode, '4' nodeval
from dual
union all
select '3' treenode, 'leaf3' nodeval
from dual
union all
select '4' treenode, 'leaf4' nodeval
from dual
union all
select '5' treenode, 'leaf5' nodeval
from dual
union all
select '6' treenode, 'leaf6' nodeval from dual)
select *
from TREETAB t
where not exists
(select t.treenode from TREETAB t2 where t2.treenode = t.nodeval)
+0
对不起,我不明白你明白那是树状态,上面的代码独立于树长。使用的数据仅用于示例。 – Seyran
0
假设你正在谈论的概率是相等的概率为每个分支则:
WITH data (tree, knot) AS (
SELECT 1, 2 FROM DUAL UNION ALL
SELECT 1, 3 FROM DUAL UNION ALL
SELECT 1, NULL FROM DUAL UNION ALL
SELECT 2, 4 FROM DUAL UNION ALL
SELECT 2, 5 FROM DUAL UNION ALL
SELECT 2, NULL FROM DUAL UNION ALL
SELECT 3, 6 FROM DUAL UNION ALL
SELECT 3, NULL FROM DUAL UNION ALL
SELECT 4, NULL FROM DUAL UNION ALL
SELECT 5, NULL FROM DUAL UNION ALL
SELECT 6, NULL FROM DUAL
),
probabilities (tree, knot, probability) AS (
SELECT tree, knot, 1/COUNT(1) OVER (PARTITION BY tree) FROM data
),
cumulative_probabilities (tree, knot, probability, path) AS (
SELECT p.*, '/' || tree
FROM probabilities p
WHERE tree = 1
UNION ALL
SELECT p.tree, p.knot, p.probability * cp.probability, cp.path || '/' || p.tree
FROM probabilities p
INNER JOIN
cumulative_probabilities cp
ON (p.tree = cp.knot)
)
SELECT *
FROM cumulative_Probabilities
WHERE knot IS NULL;
输出:
TREE KNOT PROBABILITY PATH
---- ---- ----------- ------
1 0.333333333 /1
3 0.166666667 /1/3
2 0.111111111 /1/2
6 0.166666667 /1/3/6
4 0.111111111 /1/2/4
5 0.111111111 /1/2/5
相关问题
- 1. 查找二叉查找树的高度
- 2. 查找多路树的高度
- 3. 返回二叉查找树的高度
- 4. 二叉搜索树 - 查找高度和深度
- 5. 无法找出二叉树的高度
- 6. 使用Prolog查找二叉树的高度
- 7. 如何查找树的大小和高度?
- 8. 在bfs树中查找节点的高度
- 9. 查找图片的高度
- 10. 使用队列表在二叉树中查找高度
- 11. 查找整页高度
- 12. 二叉树高度
- 13. 查找二叉树的最大深度
- 14. 二叉查找树的深度
- 15. 查找树的最大深度
- 16. 2-3-4树的高度
- 17. Carrierwave和mini_magick查找宽度和高度
- 18. 使用深度树的高度
- 19. 查找给定阵列预定义表示的BST树的高度
- 20. 如何查找html内容的高度
- 21. 使用jquery查找类的高度
- 22. 查找除以的高度数N
- 23. 查找父视图的高度
- 24. WebBrowser - 查找渲染文本的高度
- 25. 查找TextLayout组件的文本高度
- 26. 从iFrame内部查找div的高度
- 27. 以递归方式查找二叉树中节点高度的总和
- 28. SWT树项目高度
- 29. 树形图高度太长
- 30. 在numpy数组中检测树的高度和树冠宽度
不知道,也许[分层查询(https://docs.oracle.com/cd/B28359_01/server.111/b28286/queries003.htm#SQLRF52315)可以帮助您。如果您提供数据组织示例,表结构或其他内容,则将更易于理解解决方案。 – Seyran
你是什么意思“采取概率”?什么概率?它是如何计算的? – mathguy
在你的例子中,概率就是叶值,所以在我的答案中查询计算得很好,如果构建一棵真正的概率树,那么每个节点也应该有概率,@MT0答案表明,如果我理解他的代码,他应该去往每个节点的概率是相等的,并且如果没有其他定义的条件是正确的。 – Seyran