二叉树邻接表转t(L,Root,R)递归格式的Prolog实现问题
邻接表二叉树转递归格式实现
功能需求
给定以邻接表格式(例如[1-8,1-2,…])存储的无特定顺序的二叉树数据,在已知根节点的前提下,将邻接表转换为t(L,Root,R)格式的递归结构,其中L、R为对应子树的递归结构或nil。
现有实现代码
% 邻接表格式二叉树转换为递归项格式 % 调用方法:make_tree(邻接表, 根节点, 输出树结构) make_tree([],Root,t(nil,Root,nil)):-!. make_tree([Root-X],Root,t(X,Root,nil)). make_tree([Root-X],Root,t(nil,Root,X)):-!. make_tree(_,nil,nil):-!. make_tree(N,Root,t(L,Root,R)):- find_kids(N,Root,C,S), reorder(C,[C1,C2]), make_tree(S,C1,L), make_tree(S,C2,R). % 调整两个子节点的排列顺序 reorder([X,Y],[Y,X]). reorder([X,Y],[X,Y]). % 查找根节点的子节点,并将对应边从邻接表中移除 find_kids(L,Root,[C1,C2],R):- find_children(L,Root,[C1,C2|_],R). find_children([Root-Y|Xs],Root,[Y|T],Acc):- find_children(Xs,Root,T,Acc). find_children([X-Y|Xs],Root,R,[X-Y|Acc]):- X \= Root, find_children(Xs,Root,R,Acc). find_children([],_,[nil,nil],[]).
内容的提问来源于stack exchange,提问作者Benny Abramovici
相关产品推荐
相关产品推荐

