ai率降低到3.8%的方法:99.5%论文实测,免费AI检测和降AIGC工具一次讲清!
2026/10/16 9:08:52
class TreeNode: def __init__(self, value): self.value = value # 节点存储的值 self.left = None # 左子节点引用 self.right = None # 右子节点引用 # 创建根节点 root = TreeNode(10) root.left = TreeNode(5) # 左子节点 root.right = TreeNode(15) # 右子节点 # 输出根节点及其子节点的值 print(root.value) # 输出: 10 print(root.left.value) # 输出: 5 print(root.right.value) # 输出: 15上述代码定义了一个二叉树节点类,并构建了一个包含三个节点的简单树结构。通过引用关联,实现了父子节点之间的连接。| 树类型 | 特点 | 典型用途 |
|---|---|---|
| 二叉树 | 每个节点最多两个子节点 | 表达式解析、遍历练习 |
| 二叉搜索树 | 左子树值小于根,右子树值大于根 | 高效查找、插入与删除 |
| 堆 | 完全二叉树,满足堆序性 | 优先队列、堆排序 |
class TreeNode: def __init__(self, value): self.value = value # 节点存储的值 self.left = None # 左子节点引用 self.right = None # 右子节点引用该类定义了二叉树的基本节点结构。left和right分别指向左、右子树,初始为None,表示无子节点。type Node struct { ID string Address string Status string // 如:active, standby Heartbeat time.Time } func NewNode(id, addr string) *Node { return &Node{ ID: id, Address: addr, Status: "standby", Heartbeat: time.Now(), } }上述代码展示了节点结构体及其构造函数。NewNode 方法实现默认状态赋值,避免空指针风险,并统一初始化流程。func insertNode(root *TreeNode, val int) *TreeNode { if root == nil { return &TreeNode{Val: val} // 创建新节点 } if val < root.Val { root.Left = insertNode(root.Left, val) // 递归插入左子树 } else { root.Right = insertNode(root.Right, val) // 递归插入右子树 } return root }该函数接收根节点与待插入值,若当前节点为空则创建新节点并返回;否则根据大小关系选择左或右子树递归插入,最终返回原根节点以维持树结构。type Node struct { ID int ParentID *int Children []*Node } func InsertByLevel(nodes []Node) *Node { // 按ParentID分组建立映射,逐层关联子节点 nodeMap := make(map[int]*Node) root := &Node{ID: 0} for _, n := range nodes { nodeMap[n.ID] = &n } for i := range nodes { if nodes[i].ParentID == nil { *root = nodes[i] } else { parent := nodeMap[*nodes[i].ParentID] parent.Children = append(parent.Children, &nodes[i]) } } return root }该函数通过两次遍历完成层序构造:首次建立ID索引,第二次依据ParentID挂载子节点,确保层级完整性。时间复杂度为O(n),适用于大规模静态树构建。// 扩容时复制元素,但均摊时间复杂度仍为 O(1) if len(slice) == cap(slice) { newCap := cap(slice) * 2 newSlice := make([]int, len(slice), newCap) copy(newSlice, slice) slice = newSlice } slice = append(slice, value)上述机制通过预留空间减少频繁分配,实现“摊还 O(1)”的插入性能。// 二叉搜索树中删除叶节点 if node.Left == nil && node.Right == nil { node = nil // 直接置空 }此代码片段通过判断左右子树是否为空,确认为叶节点后释放引用。function replaceNode(root, targetId, newNode) { if (!root) return null; if (root.id === targetId) return newNode; // 替换命中节点 if (root.children) { root.children = root.children.map(child => replaceNode(child, targetId, newNode) ); } return root; }该递归函数以深度优先方式遍历树结构,当节点id匹配时返回新节点,实现无缝替换。// 删除后更新高度并平衡 Node* deleteNode(Node* root, int key) { // 标准删除逻辑... root->height = max(height(root->left), height(root->right)) + 1; int balance = getBalance(root); // LL情况 if (balance > 1 && getBalance(root->left) >= 0) return rightRotate(root); // RR情况 if (balance < -1 && getBalance(root->right) <= 0) return leftRotate(root); // LR和RL类似处理... }该函数在删除后重新计算节点高度,并依据平衡因子决定旋转类型,确保整棵树始终保持AVL性质。// 修改节点值并记录路径 func inorder(root *TreeNode, path []*TreeNode) { if root == nil { return } path = append(path, root) root.Val *= 2 // 就地翻倍 inorder(root.Left, path) inorder(root.Right, path) }上述代码将每个节点值就地翻倍,并通过切片维护访问路径。参数 `path` 实时记录当前递归路径,可用于后续分析或恢复操作。// 批量更新示例代码 for _, record := range records { if record.NeedsUpdate() { record.Update() updatedCount++ } if updatedCount%batchSize == 0 { db.Commit() } } db.Commit() // 提交剩余事务上述代码展示了基本的遍历更新逻辑。每次满足条件即执行更新,每达到指定批大小提交一次事务,避免长时间锁表与内存溢出。func cloneTree(root *TreeNode) *TreeNode { if root == nil { return nil } newRoot := &TreeNode{Val: root.Val} newRoot.Left = cloneTree(root.Left) // 递归复制左子树 newRoot.Right = cloneTree(root.Right) // 递归复制右子树 return newRoot }该代码采用前序遍历策略:先创建当前节点,再依次复制左右子树。这种方式确保父节点始终在子节点之前被构造,符合内存引用依赖。type LogNode struct { Message string Children []*LogNode } func LevelOrderTraversal(root *LogNode) []string { if root == nil { return nil } var result []string queue := []*LogNode{root} for len(queue) > 0 { node := queue[0] queue = queue[1:] result = append(result, node.Message) queue = append(queue, node.Children...) } return result }该函数通过队列维护待访问节点,逐层展开日志树。每次出队一个节点并将其子节点批量入队,保障了横向扩展的遍历顺序。INSERT或UPDATE会导致性能急剧下降。推荐使用批量语句减少数据库往返次数。例如,在 PostgreSQL 中可使用INSERT ... ON CONFLICT实现 UPSERT:INSERT INTO users (id, name, email) VALUES (1, 'Alice', 'alice@example.com'), (2, 'Bob', 'bob@example.com') ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name;INSERT和UPDATE操作。建议根据实际负载权衡索引数量。以下为常见操作的性能对比表:| 操作类型 | 无索引耗时(ms) | 3个索引耗时(ms) | 建议场景 |
|---|---|---|---|
| INSERT | 12 | 35 | 日志类高频写入 |
| UPDATE | 8 | 42 | 用户资料更新 |
请求到达 → 判断是否批量 → 是 → 批量执行 → 提交事务
↓ 否
检查索引影响 → 选择低开销语句 → 执行并返回