X-Git-Url: http://nitlanguage.org diff --git a/lib/trees/bintree.nit b/lib/trees/bintree.nit index 37d8c87..447a33f 100644 --- a/lib/trees/bintree.nit +++ b/lib/trees/bintree.nit @@ -36,6 +36,7 @@ import abstract_tree # * delete average O(lg n) worst O(n) # # Usage: +# # var tree = new BinTreeMap[Int, String] # tree[1] = "n1" # assert tree.min == "n1" @@ -64,7 +65,7 @@ class BinTreeMap[K: Comparable, E] # assert not tree.has_key(0) # assert tree.has_key(2) # assert not tree.has_key(6) - redef fun has_key(key: K): Bool do + redef fun has_key(key) do if is_empty then return false var res = search_down(root.as(not null), key) if res != null then @@ -85,7 +86,7 @@ class BinTreeMap[K: Comparable, E] # assert tree[1] == "n1" # assert tree.has_key(1) # assert tree[2] == "n2" - redef fun [](key: K): E do + redef fun [](key) do assert not_empty: not is_empty if cache_node != null and cache_node.key == key then return cache_node.value var res = search_down(root.as(not null), key) @@ -94,7 +95,8 @@ class BinTreeMap[K: Comparable, E] end # Search `key` in `from` and its children nodes. - protected fun search_down(from: N, key: K): nullable N do + protected fun search_down(from: N, key: nullable Object): nullable N do + if not key isa Comparable then return null var cmp = key <=> from.key if cmp == 0 then return from if from.left != null and cmp < 0 then @@ -339,7 +341,7 @@ class BinTreeMap[K: Comparable, E] redef fun show_dot do assert not_empty: root != null - var f = new OProcess("dot", "-Txlib") + var f = new ProcessWriter("dot", "-Txlib") f.write "digraph \{\n" dot_down(root.as(not null), f) f.write "\}\n" @@ -347,7 +349,7 @@ class BinTreeMap[K: Comparable, E] end # Translate the tree in dot format starting from `node`. - protected fun dot_down(node: N, f: OProcess) do + protected fun dot_down(node: N, f: ProcessWriter) do if node.left != null then dot_down(node.left.as(not null), f) f.write node.to_dot if node.right != null then dot_down(node.right.as(not null), f) @@ -378,15 +380,11 @@ end class BinTreeNode[K: Comparable, E] super TreeNode[K, E] - private var prev: nullable BinTreeNode[K, E] - private var next: nullable BinTreeNode[K, E] + private var prev: nullable BinTreeNode[K, E] = null + private var next: nullable BinTreeNode[K, E] = null redef type N: BinTreeNode[K, E] - init(key: K, item: E) do - super(key, item) - end - private var left_node: nullable N = null # `left` tree node child (null if node has no left child) @@ -455,11 +453,10 @@ end private class BinTreeMapIterator[K: Comparable, E] super MapIterator[K, E] - var current: nullable BinTreeNode[K, E] + var tree: BinTreeMap[K, E] + var current: nullable BinTreeNode[K, E] = null - init(tree: BinTreeMap[K, E]) do - current = tree.first_node - end + init do current = tree.first_node redef fun is_ok do return not current == null redef fun next do current = current.next