Modul:Benutzer:Thoken/Algor2
Die Dokumentation für dieses Modul kann unter Modul:Benutzer:Thoken/Algor2/Doku erstellt werden
-- binary search tree
-- konsole> tn=p.treenode(); tn:insert(3,"c"); tn:insert(5,"e"); tn:insert(2,"b"); tn:insert(1,"a"); tn:insert(4,"d");
-- konsole> =tn:search(4)
-- returning "d"
-- konsole> =tn:list()
-- returning ";a:1;b:2;c:3;d:4;e:5"
-- konsole> =tn:show()
-- returning a
-- b
-- c
-- d
-- e
p={}
function p.treenode() -- using code from http://www.mail-archive.com/kragen-hacks@canonical.org/msg00211.html
return {
search = function(self, key)
if self.key == nil then return end -- leafnode case
if key == self.key then return self.value end -- key match
if key < self.key then return self.left:search(key) end
return self.right:search(key)
end,
insert = function(self, key, value)
if self.key == nil then -- morph into an internal node
self.key, self.value, self.left, self.right = key, value, p.treenode(), p.treenode()
return
end
if key == self.key then return end -- no key collision handling
if key < self.key then return self.left:insert(key, value) end
return self.right:insert(key, value)
end,
list = function(self) -- raw value-key list
if self.key == nil then return "" end
return self.left:list() .. ";" .. self.value .. ":" .. self.key .. self.right:list()
end,
show = function(self, h) -- show indentation value tree
if self.key == nil then return "" end
local h = h or 0; local CR = "\n"; local TAB = " "
local indent = (function() local i,s = 1,""; while i<=h do s = s..TAB; i=i+1 end; return s end)()
return self.left:show(h+1) .. indent .. self.value .. CR .. self.right:show(h+1)
end
}
end
return p