数据结构实验返6-1二叉排序树基本运算(c++)(20分)\t\n要求实现二叉排序的基本运算,包括创建二叉排序树、查找\t删除结点等运算。
时间: 2023-05-01 15:06:56 浏览: 265
该题目要求在C++语言中实现二叉排序树的基本运算,包括创建二叉排序树、查找、插入、删除节点等操作。需要注意的是,二叉排序树的特点是左子树上的节点值均小于该节点,右子树上的节点值均大于该节点。该问题分值为20分。
相关问题
二叉排序树的基本运算c++
二叉排序树(Binary Search Tree,BST)是一种特殊的二叉树,它满足以下性质:
1. 左子树上所有节点的值小于根节点的值;
2. 右子树上所有节点的值大于根节点的值;
3. 左右子树也分别为二叉排序树。
二叉排序树的基本运算包括入、删除和遍历操作。
1.入操作:
插入操作的原理是将新节点按照叉排序树的性质插入到合的位置。插入方式可以通过递归或循环实。
2. 删除操作:
删除操作的原理是找到要删除的节点,并根据不同情况进行删除。C++中可以使用递归实现删除操作。
3. 遍历操作:
遍历操作是按照一定的顺序访问二叉排序树中的所有节点。常见的遍历方式有前序遍历、中序遍历、后序遍历和层次遍历。
以下是C++实现二叉排序树基本运算的示例代码:
```cpp
#include <iostream>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
// 插入操作
TreeNode* insert(TreeNode* root, int val) {
if (root == NULL) {
return new TreeNode(val);
}
if (val < root->val) {
root->left = insert(root->left, val);
} else {
root->right = insert(root->right, val);
}
return root;
}
// 删除操作
TreeNode* remove(TreeNode* root, int val) {
if (root == NULL) {
return NULL;
}
if (val < root->val) {
root->left = remove(root->left, val);
} else if (val > root->val) {
root->right = remove(root->right, val);
} else {
if (root->left == NULL) {
TreeNode* temp = root->right;
delete root;
return temp;
} else if (root->right == NULL) {
TreeNode* temp = root->left;
delete root;
return temp;
} else {
TreeNode* temp = root->right;
while (temp->left != NULL) {
temp = temp->left;
}
root->val = temp->val;
root->right = remove(root->right, temp->val);
}
}
return root;
}
// 前序遍历
void preorder(TreeNode* root) {
if (root == NULL) {
return;
}
cout << root->val << " ";
preorder(root->left);
preorder(root->right);
}
// 中序遍历
void inorder(TreeNode* root) {
if (root == NULL) {
return;
}
inorder(root->left);
cout << root->val << " ";
inorder(root->right);
}
// 后序遍历
void postorder(TreeNode* root) {
if (root == NULL) {
return;
}
postorder(root->left);
postorder(root->right);
cout << root->val << " ";
}
// 层次遍历
void levelorder(TreeNode* root) {
if (root == NULL) {
return;
}
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
TreeNode* node = q.front();
q.pop();
cout << node->val << " ";
if (node->left != NULL) {
q.push(node->left);
}
if (node->right != NULL) {
q.push(node->right);
}
}
}
int main() {
TreeNode* root = NULL;
root = insert(root, 5);
root = insert(root, 3);
root = insert(root, 7);
root = insert(root, 2);
root = insert(root, 4);
root = insert(root, 6);
root = insert(root, 8);
cout << "前序遍历结果:";
preorder(root);
cout << endl;
cout << "中序遍历结果:";
inorder(root);
cout << endl;
cout << "后序遍历结果:";
postorder(root);
cout << endl;
cout << "层次遍历结果:";
levelorder(root);
cout << endl;
root = remove(root, 3);
cout << "删除节点后的中序遍历结果:";
inorder(root);
cout << endl;
return 0;
}
```
实现二叉排序树的基本运算算法
实现二叉排序树的基本运算算法包括:
1. 插入操作:从根节点开始,比较插入值和当前节点的值大小关系,如果插入值比当前节点的值小,则继续在当前节点的左子树中插入;如果插入值比当前节点的值大,则继续在当前节点的右子树中插入。直到找到一个空节点,即可插入该节点。
2. 查找操作:从根节点开始,比较查找值和当前节点的值大小关系,如果查找值等于当前节点的值,则返回该节点;如果查找值小于当前节点的值,则继续在当前节点的左子树中查找;如果查找值大于当前节点的值,则继续在当前节点的右子树中查找。直到找到一个空节点,即可判断该值不存在。
3. 删除操作:先查找要删除的节点,如果该节点是叶子节点,则直接删除;如果该节点只有一个子节点,则用该子节点替换被删除的节点;如果该节点有两个子节点,则用该节点的中序遍历的后继节点替换被删除的节点,然后再删除该后继节点。
4. 遍历操作:包括前序遍历、中序遍历和后序遍历。其中前序遍历先输出当前节点,然后遍历左子树,最后遍历右子树;中序遍历先遍历左子树,然后输出当前节点,最后遍历右子树;后序遍历先遍历左子树,然后遍历右子树,最后输出当前节点。
阅读全文