| 
 | 
 
二叉树是一种树形数据结构,每个节点最多有两个子节点。以下是一个详细的 Lua 二叉树实现示例,涵盖了插入、查找、删除等操作,并展示如何创建和操作二叉树。 
 
 
 
- -- 二叉树节点定义
 
 - local Node = {}
 
 - Node.__index = Node
 
  
- -- 创建一个新的节点
 
 - function Node:new(value)
 
 -     local node = setmetatable({}, Node)
 
 -     node.value = value   -- 节点存储的值
 
 -     node.left = nil      -- 左子树
 
 -     node.right = nil     -- 右子树
 
 -     return node
 
 - end
 
  
- -- 二叉树定义
 
 - local BinaryTree = {}
 
 - BinaryTree.__index = BinaryTree
 
  
- -- 创建一个新的二叉树
 
 - function BinaryTree:new()
 
 -     local tree = setmetatable({}, BinaryTree)
 
 -     tree.root = nil  -- 树的根节点
 
 -     return tree
 
 - end
 
  
- -- 插入一个值到二叉树中
 
 - function BinaryTree:insert(value)
 
 -     local newNode = Node:new(value)
 
 -     if not self.root then
 
 -         self.root = newNode
 
 -     else
 
 -         self:_insertRecursive(self.root, newNode)
 
 -     end
 
 - end
 
  
- -- 递归插入节点
 
 - function BinaryTree:_insertRecursive(node, newNode)
 
 -     if newNode.value < node.value then
 
 -         if not node.left then
 
 -             node.left = newNode
 
 -         else
 
 -             self:_insertRecursive(node.left, newNode)
 
 -         end
 
 -     else
 
 -         if not node.right then
 
 -             node.right = newNode
 
 -         else
 
 -             self:_insertRecursive(node.right, newNode)
 
 -         end
 
 -     end
 
 - end
 
  
- -- 查找一个值
 
 - function BinaryTree:search(value)
 
 -     return self:_searchRecursive(self.root, value)
 
 - end
 
  
- -- 递归查找
 
 - function BinaryTree:_searchRecursive(node, value)
 
 -     if not node then
 
 -         return nil  -- 找不到
 
 -     end
 
  
-     if value == node.value then
 
 -         return node  -- 找到节点
 
 -     elseif value < node.value then
 
 -         return self:_searchRecursive(node.left, value)  -- 继续在左子树查找
 
 -     else
 
 -         return self:_searchRecursive(node.right, value)  -- 继续在右子树查找
 
 -     end
 
 - end
 
  
- -- 删除一个值
 
 - function BinaryTree:delete(value)
 
 -     self.root = self:_deleteRecursive(self.root, value)
 
 - end
 
  
- -- 递归删除节点
 
 - function BinaryTree:_deleteRecursive(node, value)
 
 -     if not node then
 
 -         return nil
 
 -     end
 
  
-     if value < node.value then
 
 -         node.left = self:_deleteRecursive(node.left, value)
 
 -     elseif value > node.value then
 
 -         node.right = self:_deleteRecursive(node.right, value)
 
 -     else
 
 -         -- 找到要删除的节点
 
 -         if not node.left then
 
 -             return node.right
 
 -         elseif not node.right then
 
 -             return node.left
 
 -         else
 
 -             -- 节点有两个子节点
 
 -             local minNode = self:_findMin(node.right)
 
 -             node.value = minNode.value
 
 -             node.right = self:_deleteRecursive(node.right, minNode.value)
 
 -         end
 
 -     end
 
  
-     return node
 
 - end
 
  
- -- 查找最小值节点
 
 - function BinaryTree:_findMin(node)
 
 -     while node.left do
 
 -         node = node.left
 
 -     end
 
 -     return node
 
 - end
 
  
- -- 中序遍历(递增顺序)
 
 - function BinaryTree:inOrderTraversal()
 
 -     self:_inOrderRecursive(self.root)
 
 -     print()  -- 换行
 
 - end
 
  
- -- 递归中序遍历
 
 - function BinaryTree:_inOrderRecursive(node)
 
 -     if node then
 
 -         self:_inOrderRecursive(node.left)
 
 -         io.write(node.value .. " ")
 
 -         self:_inOrderRecursive(node.right)
 
 -     end
 
 - end
 
  
- -- 前序遍历
 
 - function BinaryTree:preOrderTraversal()
 
 -     self:_preOrderRecursive(self.root)
 
 -     print()
 
 - end
 
  
- -- 递归前序遍历
 
 - function BinaryTree:_preOrderRecursive(node)
 
 -     if node then
 
 -         io.write(node.value .. " ")
 
 -         self:_preOrderRecursive(node.left)
 
 -         self:_preOrderRecursive(node.right)
 
 -     end
 
 - end
 
  
- -- 后序遍历
 
 - function BinaryTree:postOrderTraversal()
 
 -     self:_postOrderRecursive(self.root)
 
 -     print()
 
 - end
 
  
- -- 递归后序遍历
 
 - function BinaryTree:_postOrderRecursive(node)
 
 -     if node then
 
 -         self:_postOrderRecursive(node.left)
 
 -         self:_postOrderRecursive(node.right)
 
 -         io.write(node.value .. " ")
 
 -     end
 
 - end
 
 
  复制代码 代码解释- 节点 (Node):
 
- Node 类代表树中的一个节点。每个节点有一个 value 值,以及指向左子节点 (left) 和右子节点 (right) 的指针。
 
 
  - 二叉树 (BinaryTree):
 
- BinaryTree 类表示整棵树,它有一个指向根节点 (root) 的指针。
 - 该类包含了 insert, search, delete, 以及几种遍历方法。
 
 
  - 插入操作 (insert):
 
- 插入一个新的节点,如果树为空则将新节点作为根节点。
 - 否则,通过 _insertRecursive 方法递归地将新节点插入合适的位置。
 
 
  - 查找操作 (search):
 
- 通过 _searchRecursive 方法递归查找节点。如果节点值小于当前节点,继续在左子树查找;如果节点值大于当前节点,继续在右子树查找。
 
 
  - 删除操作 (delete):
 
- 使用 _deleteRecursive 方法递归删除节点。如果节点只有一个子节点,则直接替换该节点为子节点;如果节点有两个子节点,则找到右子树中的最小节点,将其值替换当前节点,然后递归删除该最小节点。
 
 
  - 遍历操作:
 
- 中序遍历 (inOrderTraversal): 按照左子树-根节点-右子树的顺序遍历树,返回递增的顺序。
 - 前序遍历 (preOrderTraversal): 按照根节点-左子树-右子树的顺序遍历。
 - 后序遍历 (postOrderTraversal): 按照左子树-右子树-根节点的顺序遍历。
 
 
   使用示例 
 
- -- 创建一个二叉树
 
 - local tree = BinaryTree:new()
 
  
- -- 插入节点
 
 - tree:insert(50)
 
 - tree:insert(30)
 
 - tree:insert(70)
 
 - tree:insert(20)
 
 - tree:insert(40)
 
 - tree:insert(60)
 
 - tree:insert(80)
 
  
- -- 打印树的中序遍历结果
 
 - print("中序遍历结果:")
 
 - tree:inOrderTraversal()  -- 输出: 20 30 40 50 60 70 80
 
  
- -- 查找某个节点
 
 - local result = tree:search(60)
 
 - if result then
 
 -     print("找到节点: " .. result.value)
 
 - else
 
 -     print("节点未找到")
 
 - end
 
  
- -- 删除节点
 
 - tree:delete(50)
 
  
- -- 打印删除后的中序遍历结果
 
 - print("删除50后的中序遍历结果:")
 
 - tree:inOrderTraversal()  -- 输出: 20 30 40 60 70 80
 
 
  复制代码 解释:- 创建一个 BinaryTree 对象,并使用 insert 方法插入一些值。
 - 使用 inOrderTraversal 输出树的中序遍历(即递增排序的节点)。
 - 查找节点值为 60 的节点,找到后输出其值。
 - 删除节点 50,并打印删除后的树的中序遍历结果。
 
  扩展:- 你可以添加其他功能,比如计算树的高度、计算节点的数量、检查树是否平衡等。
 
 
  
 
 
 
 
 
 
 
 |   
 
 
 
 |