在Haskell中,如何生成完全平衡的二叉搜索树?
该函数应该接受一个列表xs,并构造一个平衡的二进制搜索树,该树由与xs完全相同的元素集组成 结果应该是这样的: (如果列表为[1,2,3,4,5,6,7,8]) 节点(节点(节点(节点空1空)2空)4(节点空4空))5(节点(节点空6空)7(节点空8空)) 也就是说,这棵树应该是这样的:在Haskell中,如何生成完全平衡的二叉搜索树?,haskell,binary-search-tree,Haskell,Binary Search Tree,该函数应该接受一个列表xs,并构造一个平衡的二进制搜索树,该树由与xs完全相同的元素集组成 结果应该是这样的: (如果列表为[1,2,3,4,5,6,7,8]) 节点(节点(节点(节点空1空)2空)4(节点空4空))5(节点(节点空6空)7(节点空8空)) 也就是说,这棵树应该是这样的: 5 / \ 3 7 / \ / \ 2 4 6 8
5
/ \
3 7
/ \ / \
2 4 6 8
/
1
与此相反:
5
/ \
4 6
/ \
3 7
/ \
2 8
/
1
谁能告诉我怎么做?我发现我可以做第二棵树,这不是完美的平衡,但不知道如何做第一个
谢谢你的帮助!!
提前谢谢你 对输入列表进行排序。现在创建一个树,其根节点是列表的中间元素,其左子树和右子树是通过将此过程分别应用于中心左侧和右侧的子列表而生成的子树 在哈斯克尔:
buildBalanced [] = Empty
buildBalanced elts = Node (buildBalanced $ take half elts)
(elts !! half)
(buildBalanced $ drop (half+1) elts)
where half = length elts `quot` 2
main = putStrLn $ show $ buildBalanced [1,2,3,4,5,6,7,8]
-- prints Node (Node (Node (Node Empty 1 Empty) 2 Empty) 3 (Node Empty 4 Empty)) 5 (Node (Node Empty 6 Empty) 7 (Node Empty 8 Empty))
如果树的顶部必须是中间元素:
mkBalanced [] = Empty
mkBalanced xs = Node mid (mkBalanced half0) (mkBalanced half1)
where (half0, half') = splitAt ((length xs `div` 2) - 1) xs
half1 = tail half'
mid = head half'
如果没有:
mkBalanced [] = Empty
mkBalanced (x:xs) = Node x (mkBalanced half0) (mkBalanced half1)
where (half0, half1) = splitAt (length xs `div` 2) xs
使用Data.Tree.AVL(或其他一些)@josejuan:我认为OP想要找到最佳的、完全平衡的树。自我平衡只能保证它们的高度最多是它的常数倍。如果你已经有了一个长度的排序列表(x^2-1),你可以使用这个尼斯