📅  最后修改于: 2023-12-03 14:58:26.913000             🧑  作者: Mango
这是一道《计算机科学与工程联合会-GATE-CS-2005》考试中的问题。考察的是程序员的算法和数据结构的基础知识,下面进行详细介绍。
你的任务是实现一个二叉树数据结构,其中每个节点有一个整数值。你需要实现以下几个操作:
insert(i, j)
:在将节点 j
插入到值为 i
的节点的子树中delete(i)
:删除值为 i
的节点及其子树count(i)
:返回值为 i
的节点的数量inrange(i, j)
:返回值在范围 i
和 j
中的节点数量这里我们将使用 C++ 实现上述操作。我们将首先定义一个表示二叉搜索树节点的结构体:
struct Node {
int val;
Node* left;
Node* right;
Node(int x) : val(x), left(NULL), right(NULL) {}
};
然后,我们定义一个二叉搜索树类 BST
,并实现上述操作:
class BST {
public:
BST();
void insert(int target, int val);
bool deleteNode(int target);
int count(int target);
int inrange(int start, int end);
private:
Node* root;
Node* insert(Node* node, int target, int val);
Node* deleteNode(Node* node, int target);
Node* findMin(Node* node);
Node* findMax(Node* node);
int count(Node* node, int target);
int inrange(Node* node, int start, int end);
};
对于 BST
类的构造函数和 insert
、deleteNode
操作的实现,可以参考以下代码:
BST::BST() {
root = NULL;
}
void BST::insert(int target, int val) {
root = insert(root, target, val);
}
Node* BST::insert(Node* node, int target, int val) {
if (node == NULL) {
node = new Node(val);
} else if (node->val > target) {
node->left = insert(node->left, target, val);
} else {
node->right = insert(node->right, target, val);
}
return node;
}
bool BST::deleteNode(int target) {
root = deleteNode(root, target);
return root != NULL;
}
Node* BST::deleteNode(Node* node, int target) {
if (node == NULL) {
return NULL;
} else if (node->val > target) {
node->left = deleteNode(node->left, target);
} else if (node->val < target) {
node->right = deleteNode(node->right, target);
} else if (node->left != NULL && node->right != NULL) {
node->val = findMin(node->right)->val;
node->right = deleteNode(node->right, node->val);
} else {
Node* temp = node;
if (node->left == NULL) {
node = node->right;
} else if (node->right == NULL) {
node = node->left;
}
delete temp;
}
return node;
}
Node* BST::findMin(Node* node) {
while (node->left != NULL) {
node = node->left;
}
return node;
}
Node* BST::findMax(Node* node) {
while (node->right != NULL) {
node = node->right;
}
return node;
}
count
和 inrange
操作的实现,可以参考以下代码:
int BST::count(int target) {
return count(root, target);
}
int BST::count(Node* node, int target) {
if (node == NULL) {
return 0;
} else if (node->val > target) {
return count(node->left, target);
} else if (node->val < target) {
return count(node->right, target);
} else {
return 1 + count(node->left, target) + count(node->right, target);
}
}
int BST::inrange(int start, int end) {
return inrange(root, start, end);
}
int BST::inrange(Node* node, int start, int end) {
if (node == NULL) {
return 0;
} else if (node->val < start) {
return inrange(node->right, start, end);
} else if (node->val > end) {
return inrange(node->left, start, end);
} else {
return 1 + inrange(node->left, start, end) + inrange(node->right, start, end);
}
}
本文中,我们已经介绍了二叉搜索树的实现方式,并提供了 C++ 代码,用来实现插入、删除、计数、范围查找等操作。如果你需要在你自己的程序中使用此类数据结构,现在你应该具备实现它的基本能力了。