树状数组笔记
发布人:shili8
发布时间:2025-02-26 02:27
阅读次数:0
**树状数组笔记**
树状数组是一种用于解决动态数据集问题的高效数据结构。它通过将数据组织成一个二叉树来实现快速查找、插入和删除操作。树状数组在许多应用中都有重要作用,例如数据库索引、缓存管理和计算机图形学等。
**树状数组的基本概念**
树状数组是一种特殊的二叉树,每个结点代表一个整数值。每个结点的左子树包含所有小于该结点值的整数,而右子树包含所有大于该结点值的整数。这样,通过遍历树状数组,我们可以快速找到满足某些条件的整数。
**树状数组的基本操作**
树状数组支持以下基本操作:
* **查找(Find)**: 给定一个整数值,返回该值在树状数组中的位置。
* **插入(Insert)**: 将一个新整数值添加到树状数组中。
* **删除(Delete)**: 从树状数组中移除一个整数值。
**树状数组的实现**
下面是树状数组的一种简单实现:
cppclass TreeNode { public: int value; TreeNode *left; TreeNode *right; TreeNode(int val) : value(val), left(nullptr), right(nullptr) {} }; class TreeArray { private: TreeNode *root; public: TreeArray() : root(nullptr) {} ~TreeArray() { destroyTree(root); } void insert(int val) { if (root == nullptr) { root = new TreeNode(val); } else { insertNode(root, val); } } int find(int val) { return findNode(root, val); } void deleteValue(int val) { root = deleteNode(root, val); } private: void destroyTree(TreeNode *node) { if (node != nullptr) { destroyTree(node->left); destroyTree(node->right); delete node; } } int findNode(TreeNode *node, int val) { if (node == nullptr) { return -1; // not found } else if (val < node->value) { return findNode(node->left, val); } else if (val > node->value) { return findNode(node->right, val); } else { return node->value; } } void insertNode(TreeNode *node, int val) { if (val < node->value) { if (node->left == nullptr) { node->left = new TreeNode(val); } else { insertNode(node->left, val); } } else if (val > node->value) { if (node->right == nullptr) { node->right = new TreeNode(val); } else { insertNode(node->right, val); } } } int deleteNode(TreeNode *node, int val) { if (node == nullptr) { return nullptr; } else if (val < node->value) { node->left = deleteNode(node->left, val); return node; } else if (val > node->value) { node->right = deleteNode(node->right, val); return node; } else { // found the node to be deleted if (node->left == nullptr && node->right == nullptr) { delete node; return nullptr; } else if (node->left == nullptr) { TreeNode *temp = node->right; delete node; return temp; } else if (node->right == nullptr) { TreeNode *temp = node->left; delete node; return temp; } else { // find the smallest value in the right subtree TreeNode *smallest = findSmallest(node->right); node->value = smallest->value; node->right = deleteNode(node->right, smallest->value); return node; } } } TreeNode *findSmallest(TreeNode *node) { while (node->left != nullptr) { node = node->left; } return node; } };
**树状数组的时间复杂度**
树状数组的基本操作(查找、插入和删除)都具有以下时间复杂度:
* **查找(Find)**: O(h),其中 h 是树状数组的高度。
* **插入(Insert)**: O(h)。
* **删除(Delete)**: O(h)。
由于树状数组是一棵平衡二叉树,h = log(n),因此上述时间复杂度可以简化为:
* **查找(Find)**: O(log n)。
* **插入(Insert)**: O(log n)。
* **删除(Delete)**: O(log n)。
**总结**
树状数组是一种高效的数据结构,用于解决动态数据集问题。它通过将数据组织成一个二叉树来实现快速查找、插入和删除操作。树状数组支持基本操作,如查找、插入和删除,并且具有良好的时间复杂度。