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

本文介绍了一种使用Lua编写的二叉搜索树的数据结构及其基本操作,包括插入、查找和删除节点等,并提供了前序、中序和后序遍历的递归与非递归实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值