1. 程式人生 > >平衡二叉樹的簡單建立--示例

平衡二叉樹的簡單建立--示例

<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++也容易