利用Lua实现二叉查找树并进行各种遍历

-- 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)

利用Lua实现二叉查找树并进行各种遍历

时间: 2024-10-13 11:31:21

利用Lua实现二叉查找树并进行各种遍历的相关文章

利用foreach对页面控件的遍历 及三目运算符的使用

1.利用foreach对页面控件的遍历 及三目运算符的使用 利用div将一组CheckBox放在一起用于遍历 <body> <form id="form1" runat="server"> <div> <asp:CheckBox ID="cb_1" runat="server" AutoPostBack="true" Text="我是自动的" o

新手学习算法----二叉树(将一个二叉查找树按照中序遍历转换成双向链表)

题目:将一个二叉查找树按照中序遍历转换成双向链表. 给定一个二叉查找树: 4 / 2 5 / 1 3 返回 1<->2<->3<->4<->5. 思路:如果对于当前节点,把右子树转换成双向链表,然后把左子树转换成双向链表,转换的时候我们都标记了链表的头节点和尾节点,那么只需要将当前节点和左子树的尾部相连,和右子树的头部相连即可. Java代码:这个是借鉴九章里面的解题法.但是对于左右子树转换成二叉树也不是很理解,还待需要继续分析. /** * Definit

Nginx利用lua剪辑FastDFS图片

Nginx利用lua剪辑FastDFS中的图片 我们经常用FastDFS来做图片服务器,通过nginx来上传或者获取图片.本文要实现的功能是,当客户点要获取不同尺寸的图片是,lua根据url中的尺寸大小调用GraphicsMagick 的gm命令来剪辑图片. 1.软件准备: GraphicsMagick-1.3.21.tar.gz LuaJIT-2.0.2.tar.gz nginx-1.4.2.tar.gz ngx_devel_kit-0.2.18.tar.gz v0.8.6.tar.gz(lu

CentOS6.4 安装OpenResty和Redis 并在Nginx中利用lua简单读取Redis数据

1.下载OpenResty和Redis OpenResty下载地址:wget http://openresty.org/download/ngx_openresty-1.4.3.6.tar.gz Redis下载地址:wget http://download.redis.io/releases/redis-2.8.6.tar.gz 2.安装依赖包 yum install -y gcc gcc-c++ readline-devel pcre-devel openssl-devel tcl perl

C语言强化(八)判断序列是不是二叉查找树的后序遍历结果

前面聊了一系列关于链表相交的问题,本篇博文,让我们通过一道简单的判断题,复习复习数组和二叉树. 通过这道题,你可以掌握 二叉查找树的规律 后序遍历的特点 递归的使用 题目 输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果. 如果是返回 true,否则返回 false. 例如输入 5.7.6.9.11.10.8,由于这一整数序列是如下树的后序遍历结果: 因此返回 true. 如果输入 7.4.6.5,没有哪棵树的后序遍历的结果是这个序列,因此返回 false. 看到二元查找树(or二

判断一个序列是否是一个二叉查找树的后序遍历结果

题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果.如果是返回 true,否则返 回 false . 例如输入 5.7.6.9.11 .10.8,由于这一整数序列是如下树的后序遍历结果: 8 / \ 6 10 / \ / \ 5 7 9 11 因此返回 true. 如果输入 7.4.6.5,没有哪棵树的后序遍历的结果是这个序列,因此返回 false . 思路:对于树的很多问题都是可以使用递归来解决.这道题也不例外.首先明白后序遍历的特点,最后一个是根元素.左子树都比根元素打,右

JavaScript利用数组原型,添加方法实现遍历多维数组每一个元素

原型就是提供给我们为了让我们扩展更多功能的. 今天学习了用js模拟底层代码,实现数组多维的遍历.思想是在数组原型上添加一个方法. 1 // js中的数组forEach方法,传入回掉函数 能够帮助我们遍历数组 2 var arr =[1,2,3,4,[1,2,[1,4]]]; 3 arr.forEach( 4 function(item , index , arr){ 5 alert(item); //1 2 3 4 1214 6 } 7 ); 8 //我们发现 这个方法只提供给我们遍历一维数组的

nginx利用lua实现nginx反向代理proxy_store缓存文件自删除

因为自己网站526net一直放在国外,速度一直不怎么理想.所以网站前端一直是买一些低配廉价,但是对国内线路友好的机器来做反向代理. nginx的反向代理可以说已经很好用了,我一直使用proxy_store方式来做缓存,唯一的缺点就是不会自动清理缓存.我是通过定时任务自动删除的. 但是还是做不到我要的效果,前两天使用lua写了脚本,实现客户访问前端,lua判断文件的创建时间,然后根据设定的时间来自动删除缓存. nginx 的设置我就不多说了,lua的安装可以参考 <LNMP平滑升级nginx并安装

二叉查找树的插入和遍历

数节点: public class Node { private int value; //data private Node leftChild; //左孩子节点 private Node rightChild; //右孩子节点 public Node(int value, Node leftChild, Node rightChild){ this.value = value; this.leftChild = leftChild; this.rightChild = rightChild;