|
二叉树是一种树形数据结构,每个节点最多有两个子节点。以下是一个详细的 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,并打印删除后的树的中序遍历结果。
扩展:- 你可以添加其他功能,比如计算树的高度、计算节点的数量、检查树是否平衡等。
|
|