我正在学习Prolog,并试图使用Prolog找到二叉树的深度。 我代表这样一棵树:
nil is a tree.
tree(1,nil,nil) this is a leaf.
tree(1,tree(1,nil,nil),nil) this is a tree with root 1 and has a left leaf 1.
我想要一个深度谓词,即如果N是树T的深度,那么深度(T,N)将为真。 我假设当T不是变量时我会使用深度谓词,但N可以是变量。 的实施例
?- depth(nil,N).
N = 0.
?- depth(tree(1,tree(2,nil,tree(3,nil,nil)),tree(5,tree(6,nil,nil),nil)),N).
N = 3.
?- depth(tree(1,nil,tree(2,nil,nil)),N).
N = 2.
我不确定N将如何成为2个子树之间的最大值。
感谢您的帮助。
解决方案:
depth(nil,0).
depth(tree(_,nil,nil),1).
depth(tree(_,Left,Right), D) :-
depth(Left,DLeft),
depth(Right,DRight),
D is max(DLeft, DRight) + 1.
答案 0 :(得分:3)
像饼一样容易:nil
的深度为0:
depth(nil,0).
对于tree
案例,请在两个分支上递归调用depth/2
并max
:
depth(Left,DLeft),
depth(Right,DRight),
D is max(DLeft, DRight) + 1.
答案 1 :(得分:2)
% I added Root \= nil, simulating a null node and it works
depth_tree(nil, 0).
depth_tree(node(Root, Left, Right), Depth):-
Root\= nil,
depth_tree(Left, DepthLeft),
depth_tree(Right, DepthRight),
Depth is max(DepthLeft, DepthRight) + 1.