如何使用Prolog查找二叉树的深度

时间:2011-01-22 12:46:55

标签: prolog

我正在学习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.

2 个答案:

答案 0 :(得分:3)

像饼一样容易:nil的深度为0:

depth(nil,0).

对于tree案例,请在两个分支上递归调用depth/2max

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.