利用Lua实现二叉查找树并进行各种遍历
2014-07-14 18:35
232 查看
-- author : coder_zhang -- date : 2014-6-25 root = nil function insert_node(number) if root == nil then root = {value = number, left = nil, right = nil, parent = nil} else q = root r = nil while q ~= nil do r = q if q.value > number then q = q.left elseif q.value < number then q = q.right else return end end if r.value > number then r.left = {value = number, left = nil, right = nil, parent = r} else r.right = {value = number, left = nil, right = nil, parent = r} end end end function find_node(p, number) while p ~= nil do if p.value == number then return p elseif p.value > number then p = p.left else p = p.right end end return p end function delete_node(number) p = find_node(root, number) if p == nil then print ("can\'t find " .. number) return end real_del = nil if p.left == nil or p.right == nil then real_del = p else q = p.right r = nil while q ~= nil do r = q q = q.left end real_del = r end child = nil if real_del.left ~= nil then child = real_del.left else child = real_del.right end if child ~= nil then child.parent = real_del.parent end if real_del.parent == nil then root = child else if real_del.parent.left == real_del then real_del.parent.left = child else real_del.parent.right = child end end if real_del ~= p then p.value = real_del.value end real_del = nil end function pre_order(p) if p ~= nil then print (p.value) pre_order(p.left) pre_order(p.right) end end function in_order(p) if p ~= nil then in_order(p.left) print (p.value) in_order(p.right) end end function post_order(p) if p ~= nil then post_order(p.left) post_order(p.right) print (p.value) end end function pre_order_no_rec(p) stack = {} while p ~= nil or #stack ~= 0 do if p == nil then p = stack[#stack] stack[#stack] = nil end print (p.value) if p.right ~= nil then stack[#stack + 1] = p.right end p = p.left end end function in_order_no_rec(p) stack = {} while p ~= nil or #stack ~= 0 do if p == nil then p = stack[#stack] stack[#stack] = nil print (p.value) p = p.right else stack[#stack + 1] = p p = p.left end end end function post_order_no_rec(p) stack = {} while p ~= nil do stack[#stack + 1] = {node = p, status = 0} p = p.left end while #stack ~= 0 do p = stack[#stack] if p.node.right == nil or p.status == 1 then print (p.node.value) stack[#stack] = nil else p = p.node.right stack[#stack].status = 1 while p ~= nil do stack[#stack + 1] = {node = p, status = 0} p = p.left end end end end array = {5, 3, 2, 4, 7, 6, 8} i = 1 while i <= #array do insert_node(array[i]) i = i + 1 end print ("--------pre order---------") pre_order(root) print ("--------------------------") print ("-------in order-----------") in_order(root) print("---------------------------") print ("-------post order---------") post_order(root) print ("--------------------------") print ("-----pre order no rec-----") pre_order_no_rec(root) print ("--------------------------") print ("-----in order no rec------") in_order_no_rec(root) print ("--------------------------") print ("---post order no rec------") post_order_no_rec(root) print ("--------------------------") delete_node(3) pre_order(root)
相关文章推荐
- JavaScript中利用各种循环进行遍历的方式总结
- 数据结构C#实现-二叉查找树的创建,查找,以及各种递归(非递归)遍历算法
- JavaScript中利用各种循环进行遍历的方式总结
- PHP中利用mysql进行访问统计的思路和实现代码
- 利用CEGUI+Lua实现灵活的游戏UI框架
- 各种基本算法实现小结(四)—— 图及其遍历
- 【MySQL利用变量实现各种排序】
- 利用vc++中的winInet进行网络编程实现了下载网站的源代码
- 利用C++Builder 中OLE自动化功能实现调用Word进行报表制作
- [Lua]利用Luacom进行Excel文件的操作
- 利用CEGUI和Lua实现框架
- 利用Ireport和JasperReport实现导出各种格式
- 二叉树实现(包括遍历等各种操作,递归与非递归)
- C/S中利用域控进行SSO的简单实现方式
- 利用CEGUI+Lua实现灵活的游戏UI框架
- 利用google对特定站点进行测试的实现
- 利用PHP实现通过千千静听的歌曲列表进行歌曲导入
- [VB.NET]利用vb.net创建一个完全可编辑的DataGrid,从而实现操作Access数据库进行增,删,改的功能,前提是不用任何其他的Button
- 利用 IEnumerable接口 实现自定义类型的集合的foreach遍历
- C/S中利用域控进行SSO的简单实现方式