大牛阁下资源

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 270|回复: 8

lua二叉树结构详细例子

[复制链接]

111

主题

14

回帖

536

积分

管理员

积分
536
发表于 2024-11-25 11:39:58 | 显示全部楼层 |阅读模式
二叉树是一种树形数据结构,每个节点最多有两个子节点。以下是一个详细的 Lua 二叉树实现示例,涵盖了插入、查找、删除等操作,并展示如何创建和操作二叉树。



  1. -- 二叉树节点定义
  2. local Node = {}
  3. Node.__index = Node

  4. -- 创建一个新的节点
  5. function Node:new(value)
  6.     local node = setmetatable({}, Node)
  7.     node.value = value   -- 节点存储的值
  8.     node.left = nil      -- 左子树
  9.     node.right = nil     -- 右子树
  10.     return node
  11. end

  12. -- 二叉树定义
  13. local BinaryTree = {}
  14. BinaryTree.__index = BinaryTree

  15. -- 创建一个新的二叉树
  16. function BinaryTree:new()
  17.     local tree = setmetatable({}, BinaryTree)
  18.     tree.root = nil  -- 树的根节点
  19.     return tree
  20. end

  21. -- 插入一个值到二叉树中
  22. function BinaryTree:insert(value)
  23.     local newNode = Node:new(value)
  24.     if not self.root then
  25.         self.root = newNode
  26.     else
  27.         self:_insertRecursive(self.root, newNode)
  28.     end
  29. end

  30. -- 递归插入节点
  31. function BinaryTree:_insertRecursive(node, newNode)
  32.     if newNode.value < node.value then
  33.         if not node.left then
  34.             node.left = newNode
  35.         else
  36.             self:_insertRecursive(node.left, newNode)
  37.         end
  38.     else
  39.         if not node.right then
  40.             node.right = newNode
  41.         else
  42.             self:_insertRecursive(node.right, newNode)
  43.         end
  44.     end
  45. end

  46. -- 查找一个值
  47. function BinaryTree:search(value)
  48.     return self:_searchRecursive(self.root, value)
  49. end

  50. -- 递归查找
  51. function BinaryTree:_searchRecursive(node, value)
  52.     if not node then
  53.         return nil  -- 找不到
  54.     end

  55.     if value == node.value then
  56.         return node  -- 找到节点
  57.     elseif value < node.value then
  58.         return self:_searchRecursive(node.left, value)  -- 继续在左子树查找
  59.     else
  60.         return self:_searchRecursive(node.right, value)  -- 继续在右子树查找
  61.     end
  62. end

  63. -- 删除一个值
  64. function BinaryTree:delete(value)
  65.     self.root = self:_deleteRecursive(self.root, value)
  66. end

  67. -- 递归删除节点
  68. function BinaryTree:_deleteRecursive(node, value)
  69.     if not node then
  70.         return nil
  71.     end

  72.     if value < node.value then
  73.         node.left = self:_deleteRecursive(node.left, value)
  74.     elseif value > node.value then
  75.         node.right = self:_deleteRecursive(node.right, value)
  76.     else
  77.         -- 找到要删除的节点
  78.         if not node.left then
  79.             return node.right
  80.         elseif not node.right then
  81.             return node.left
  82.         else
  83.             -- 节点有两个子节点
  84.             local minNode = self:_findMin(node.right)
  85.             node.value = minNode.value
  86.             node.right = self:_deleteRecursive(node.right, minNode.value)
  87.         end
  88.     end

  89.     return node
  90. end

  91. -- 查找最小值节点
  92. function BinaryTree:_findMin(node)
  93.     while node.left do
  94.         node = node.left
  95.     end
  96.     return node
  97. end

  98. -- 中序遍历(递增顺序)
  99. function BinaryTree:inOrderTraversal()
  100.     self:_inOrderRecursive(self.root)
  101.     print()  -- 换行
  102. end

  103. -- 递归中序遍历
  104. function BinaryTree:_inOrderRecursive(node)
  105.     if node then
  106.         self:_inOrderRecursive(node.left)
  107.         io.write(node.value .. " ")
  108.         self:_inOrderRecursive(node.right)
  109.     end
  110. end

  111. -- 前序遍历
  112. function BinaryTree:preOrderTraversal()
  113.     self:_preOrderRecursive(self.root)
  114.     print()
  115. end

  116. -- 递归前序遍历
  117. function BinaryTree:_preOrderRecursive(node)
  118.     if node then
  119.         io.write(node.value .. " ")
  120.         self:_preOrderRecursive(node.left)
  121.         self:_preOrderRecursive(node.right)
  122.     end
  123. end

  124. -- 后序遍历
  125. function BinaryTree:postOrderTraversal()
  126.     self:_postOrderRecursive(self.root)
  127.     print()
  128. end

  129. -- 递归后序遍历
  130. function BinaryTree:_postOrderRecursive(node)
  131.     if node then
  132.         self:_postOrderRecursive(node.left)
  133.         self:_postOrderRecursive(node.right)
  134.         io.write(node.value .. " ")
  135.     end
  136. end
复制代码
代码解释
  • 节点 (Node):
    • Node 类代表树中的一个节点。每个节点有一个 value 值,以及指向左子节点 (left) 和右子节点 (right) 的指针。
  • 二叉树 (BinaryTree):
    • BinaryTree 类表示整棵树,它有一个指向根节点 (root) 的指针。
    • 该类包含了 insert, search, delete, 以及几种遍历方法。
  • 插入操作 (insert):
    • 插入一个新的节点,如果树为空则将新节点作为根节点。
    • 否则,通过 _insertRecursive 方法递归地将新节点插入合适的位置。
  • 查找操作 (search):
    • 通过 _searchRecursive 方法递归查找节点。如果节点值小于当前节点,继续在左子树查找;如果节点值大于当前节点,继续在右子树查找。
  • 删除操作 (delete):
    • 使用 _deleteRecursive 方法递归删除节点。如果节点只有一个子节点,则直接替换该节点为子节点;如果节点有两个子节点,则找到右子树中的最小节点,将其值替换当前节点,然后递归删除该最小节点。
  • 遍历操作:
    • 中序遍历 (inOrderTraversal): 按照左子树-根节点-右子树的顺序遍历树,返回递增的顺序。
    • 前序遍历 (preOrderTraversal): 按照根节点-左子树-右子树的顺序遍历。
    • 后序遍历 (postOrderTraversal): 按照左子树-右子树-根节点的顺序遍历。
使用示例

  1. -- 创建一个二叉树
  2. local tree = BinaryTree:new()

  3. -- 插入节点
  4. tree:insert(50)
  5. tree:insert(30)
  6. tree:insert(70)
  7. tree:insert(20)
  8. tree:insert(40)
  9. tree:insert(60)
  10. tree:insert(80)

  11. -- 打印树的中序遍历结果
  12. print("中序遍历结果:")
  13. tree:inOrderTraversal()  -- 输出: 20 30 40 50 60 70 80

  14. -- 查找某个节点
  15. local result = tree:search(60)
  16. if result then
  17.     print("找到节点: " .. result.value)
  18. else
  19.     print("节点未找到")
  20. end

  21. -- 删除节点
  22. tree:delete(50)

  23. -- 打印删除后的中序遍历结果
  24. print("删除50后的中序遍历结果:")
  25. tree:inOrderTraversal()  -- 输出: 20 30 40 60 70 80
复制代码
解释:
  • 创建一个 BinaryTree 对象,并使用 insert 方法插入一些值。
  • 使用 inOrderTraversal 输出树的中序遍历(即递增排序的节点)。
  • 查找节点值为 60 的节点,找到后输出其值。
  • 删除节点 50,并打印删除后的树的中序遍历结果。
扩展:
  • 你可以添加其他功能,比如计算树的高度、计算节点的数量、检查树是否平衡等。








111

主题

14

回帖

536

积分

管理员

积分
536
 楼主| 发表于 2024-11-25 12:28:46 | 显示全部楼层
+1

0

主题

255

回帖

538

积分

高级会员

积分
538
发表于 2024-11-28 06:01:23 | 显示全部楼层
感谢分享

111

主题

14

回帖

536

积分

管理员

积分
536
 楼主| 发表于 2024-12-12 11:05:56 | 显示全部楼层
6666666

0

主题

8

回帖

28

积分

新手上路

积分
28
发表于 2025-1-8 19:53:19 | 显示全部楼层
谢谢分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|大牛阁下资源网

GMT+8, 2025-1-23 03:58 , Processed in 0.104168 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表