平衡二叉樹的簡單建立--示例
阿新 • • 發佈:2019-01-09
<pre name="code" class="plain">PG.lua檔案 -- 這個用來輸出處理 打log
PG = {}
function PG.Log(str)
print(str);
end
首先是pinghengtree.lua檔案 資料結構定義在這裡
require "PG"; _M = {}; rawset(_M,"pinghengtree",{}); local pinghengtree = rawget(_M,"pinghengtree"); -- pinghengtree = {}; pinghengtree.tree = {}; local tree = pinghengtree.tree; function tree: new(lefttree,righttree,data) local o = {}; o.data = data; o.lefttree = lefttree; o.righttree = righttree; setmetatable(o,self); self.__index = self; return o; end function tree:AddChild(direction,data) PG.Log(direction); if direction == "left" then PG.Log(" exe this?") if self.lefttree == nil then PG.Log("self's leftnode is nil ") self.lefttree = self:new(nil,nil,data); else self.lefttree.data = data; end elseif direction == "right" then if self.righttree == nil then self.righttree = self:new(nil,nil,data); PG.Log("self's rightnode is nil ") else self.righttree.data = data; end end end function pinghengtree.FindRoot(rt,data) if rt == nil then return nil; end if rt.data == data then return rt; else local t = nill; t = pinghengtree.FindRoot(rt.lefttree,data) if t ~= nil then return t; end t = pinghengtree.FindRoot(rt.righttree,data) if t ~= nil then return t; end return nil; end end function pinghengtree.CreateNode(rt,data) if rt.data < data then if rt.righttree ~= nil then return pinghengtree.CreateNode(rt.righttree,data); else local tree = pinghengtree.Class(); rt.righttree= tree:new(nil,nil,data); return rt.righttree; end end if rt.data == data then return rt; end if rt.data > data then if rt.lefttree ~= nil then return pinghengtree.CreateNode(rt.lefttree,data); else local tree = pinghengtree.Class(); rt.lefttree = tree:new(nil,nil,data); return rt.lefttree; end end end local datali= {1,3,5,7,2,4,6,8,9,10}; function pinghengtree.Class() return tree; end function pinghengtree.PrintTree(rt) if rt ~= nil then PG.Log(rt.data); end if rt.lefttree~= nil then pinghengtree.PrintTree(rt.lefttree); end if rt.righttree~= nil then pinghengtree.PrintTree(rt.righttree); end end function pinghengtree.CreateTree(rt,datalist) -- dt is data list for i = 2,#datalist do pinghengtree.CreateNode(rt,datalist[i]); end end -- pinghengtree.Test = function( ) -- print("tet"); -- end function pinghengtree.Test() print("tet"); end
最後是main.lua檔案<pre name="code" class="plain">local datalist = {1,3,5,7,2,4,6,8,9,10};
local tree = treeRoot:new(nil,nil,datalist[1]);
pinghengtree.CreateTree(tree,datalist);
for i = 1,10 do
local newRoot = pinghengtree.FindRoot(tree,i);
PG.Log(newRoot.data);
end
pinghengtree.PrintTree(tree);
--後續會加入新的內容 為什麼用lua來實現 lua簡單啊 不像c++ 記憶體處理 指標 繁雜的語法就是大大的障礙 還是指令碼比較容易表達思想 改成c++也容易