如何在2-3棵树中搜索成员

发布于 2025-01-18 14:22:34 字数 563 浏览 0 评论 0原文

下面的代码成功找到二叉树中的成员。只是现在我想在 2-3 树中找到一个成员。 (类似于 https://www.youtube.com/watch?v= vSbBB4MRzp4。)下面的最后一行是尝试执行此操作。但我不确定标记为 TBD 的项目要使用什么(并且该行的其他部分可能是错误的)。关于如何执行此操作有任何帮助吗?谢谢!

bTree(L,X,R).

member(X, bTree(L,Y,_)) :-       
    X #< Y,
    member(X,L).
member(X, bTree(_,X,_)).
member(X, bTree(_,Y,R)) :-
    X #> Y,                      
    member(X,R).
member(X, bTree(L,Y,R)) :-
    X #> TBD, X #< TBD                     
    member(X,TBD).

The code below successfully finds a member in a binary tree. Except that now I want to find a member in a 2-3 tree. (Similar to the tree shown in https://www.youtube.com/watch?v=vSbBB4MRzp4.) The last line below is an attempt to do this. But I am unsure what to use for the items marked TBD (and other parts of this line could be wrong). Any help on how to do this? Thanks!

bTree(L,X,R).

member(X, bTree(L,Y,_)) :-       
    X #< Y,
    member(X,L).
member(X, bTree(_,X,_)).
member(X, bTree(_,Y,R)) :-
    X #> Y,                      
    member(X,R).
member(X, bTree(L,Y,R)) :-
    X #> TBD, X #< TBD                     
    member(X,TBD).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

药祭#氼 2025-01-25 14:22:34

2–3-tree 中,每个节点可以是:

  • 2节点,例如t(左,键,右),有一个钥匙和两个孩子,或
  • 3节点,例如t(左,键1,中间,键2,右),有两个键和三个孩子。

因此,2-3-tree:

”在此处输入图像描述

可以表示为:

mytree(
  t(t(t(nil,1,nil),
    4,
    t(nil,5,nil,7,nil),
    13,
    t(nil,15,nil)),
  16,
  t(t(nil,17,nil,19,nil),
    20,
    t(nil,22,nil),
    24,
    t(nil,29,nil)))
).

搜索此树,您可以使用以下谓词:示例:

:- use_module(library(clpfd)).

% search 2-nodes: t(Left, Key, Right)

has(t(L,X,_), K) :- K #< X, has(L, K).
has(t(_,K,_), K).
has(t(_,X,R), K) :- K #> X, has(R, K).

% search 3-nodes: t(Left, Key1, Middle, Key2, Right)

has(t(L,X,_,_,_), K) :- K #< X, has(L, K).
has(t(_,K,_,_,_), K).
has(t(_,X,M,Y,_), K) :- K #> X, K #< Y, has(M, K).
has(t(_,_,_,K,_), K).
has(t(_,_,_,Y,R), K) :- K #> Y, has(R, K).

示例:

?- mytree(T), has(T, 51).
false.

?- mytree(T), has(T, 16).
T = t(t(t(nil, 1, nil), 4, t(nil, 5, nil, 7, nil), 13, t(nil, 15, nil)), 16, t(t(nil, 17, nil, 19, nil), 20, t(nil, 22, nil), 24, t(nil, 29, nil))) .

?- mytree(T), forall(has(T,X), writeln(X)).
1
4
5
7
13
15
16
17
19
20
22
24
29
T = t(t(t(nil, 1, nil), 4, t(nil, 5, nil, 7, nil), 13, t(nil, 15, nil)), 16, t(t(nil, 17, nil, 19, nil), 20, t(nil, 22, nil), 24, t(nil, 29, nil))).

In a 2–3-tree, each node can be a:

  • 2-node, say t(Left,Key,Right), that has one key and two children, or
  • 3-node, say t(Left,Key1,Middle,Key2,Right), that has two keys and three children.

Thus, the 2-3-tree:

enter image description here

can be represented as:

mytree(
  t(t(t(nil,1,nil),
    4,
    t(nil,5,nil,7,nil),
    13,
    t(nil,15,nil)),
  16,
  t(t(nil,17,nil,19,nil),
    20,
    t(nil,22,nil),
    24,
    t(nil,29,nil)))
).

To search this tree, you can use the following predicate:

:- use_module(library(clpfd)).

% search 2-nodes: t(Left, Key, Right)

has(t(L,X,_), K) :- K #< X, has(L, K).
has(t(_,K,_), K).
has(t(_,X,R), K) :- K #> X, has(R, K).

% search 3-nodes: t(Left, Key1, Middle, Key2, Right)

has(t(L,X,_,_,_), K) :- K #< X, has(L, K).
has(t(_,K,_,_,_), K).
has(t(_,X,M,Y,_), K) :- K #> X, K #< Y, has(M, K).
has(t(_,_,_,K,_), K).
has(t(_,_,_,Y,R), K) :- K #> Y, has(R, K).

Examples:

?- mytree(T), has(T, 51).
false.

?- mytree(T), has(T, 16).
T = t(t(t(nil, 1, nil), 4, t(nil, 5, nil, 7, nil), 13, t(nil, 15, nil)), 16, t(t(nil, 17, nil, 19, nil), 20, t(nil, 22, nil), 24, t(nil, 29, nil))) .

?- mytree(T), forall(has(T,X), writeln(X)).
1
4
5
7
13
15
16
17
19
20
22
24
29
T = t(t(t(nil, 1, nil), 4, t(nil, 5, nil, 7, nil), 13, t(nil, 15, nil)), 16, t(t(nil, 17, nil, 19, nil), 20, t(nil, 22, nil), 24, t(nil, 29, nil))).
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文