用c++代码求等概论情况下二叉排序树的平均查找长度
时间: 2023-09-05 18:09:06 浏览: 136
下面是用C++实现求二叉排序树等概率情况下的平均查找长度的代码:
```c++
#include <iostream>
#include <cmath>
using namespace std;
// 计算二叉排序树等概率情况下的平均查找长度
double binarySearchTreeASL(int n) {
int d = log2(n+1); // 树的深度
double sum = 0;
for (int i = 1; i <= d; i++) {
sum += i * pow(2, i-1);
}
return sum / (pow(2, d)-1);
}
int main() {
int n = 100; // 节点数
double asl = binarySearchTreeASL(n);
cout << "等概率情况下二叉排序树的平均查找长度为:" << asl << endl;
return 0;
}
```
在这个程序中,我们先计算出二叉排序树的深度d,然后按照公式计算每个节点被查找的概率乘以节点的深度之和,最后除以总节点数,即可得到等概率情况下的平均查找长度。这里我们假设二叉排序树中有100个节点,可以根据实际情况修改节点数n的值进行计算。
相关问题
设计算法,对给定的二叉排序树,求出在等概论情况下的平均查找长度。用C++语言写出算法
以下是对给定的二叉排序树求出在等概论情况下的平均查找长度的算法,使用了递归实现:
```c++
#include <iostream>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
int getNodeNum(TreeNode* root) { // 计算节点个数
if (!root) return 0;
return getNodeNum(root->left) + getNodeNum(root->right) + 1;
}
int getDepth(TreeNode* root) { // 计算树的深度
if (!root) return 0;
int leftDepth = getDepth(root->left);
int rightDepth = getDepth(root->right);
return max(leftDepth, rightDepth) + 1;
}
double getASL(TreeNode* root) { // 计算平均查找长度
if (!root) return 0;
int nodeNum = getNodeNum(root);
int depth = getDepth(root);
double sum = 0;
for (int i = 1; i <= depth; i++) {
int levelNodes = 0;
getLevelNodes(root, i, levelNodes);
sum += i * levelNodes;
}
return sum / nodeNum;
}
void getLevelNodes(TreeNode* root, int level, int& levelNodes) { // 计算某一层的节点数
if (!root) return;
if (level == 1) {
levelNodes++;
return;
}
getLevelNodes(root->left, level - 1, levelNodes);
getLevelNodes(root->right, level - 1, levelNodes);
}
int main() {
// 构建二叉排序树
TreeNode* root = new TreeNode(5);
root->left = new TreeNode(3);
root->right = new TreeNode(7);
root->left->left = new TreeNode(1);
root->left->right = new TreeNode(4);
root->right->left = new TreeNode(6);
root->right->right = new TreeNode(8);
cout << "The average search length is: " << getASL(root) << endl;
return 0;
}
```
该算法首先计算出二叉排序树的节点个数和深度,然后分别计算每一层的节点数和该层节点的 ASL,最后求和并除以节点个数即可得到平均查找长度。
首先编程实现读入一串字符创建一棵二叉排序树,然后分别实现:二叉排序树的查找;二叉排序树的插入;二叉排序树的删除等操作。C++写
以下是C++实现读入一串字符创建一棵二叉排序树,并实现二叉排序树的查找、插入、删除等操作的代码:
```cpp
#include <iostream>
using namespace std;
// 二叉排序树结点的定义
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
// 二叉排序树的查找
bool searchBST(TreeNode* root, int val) {
if (root == NULL) {
return false;
}
if (root->val == val) {
return true;
} else if (root->val > val) {
return searchBST(root->left, val);
} else {
return searchBST(root->right, val);
}
}
// 二叉排序树的插入
TreeNode* insertBST(TreeNode* root, int val) {
if (root == NULL) {
return new TreeNode(val);
}
if (root->val > val) {
root->left = insertBST(root->left, val);
} else {
root->right = insertBST(root->right, val);
}
return root;
}
// 二叉排序树的删除
TreeNode* deleteBST(TreeNode* root, int val) {
if (root == NULL) {
return NULL;
}
if (root->val == val) {
if (root->left == NULL) {
return root->right;
} else if (root->right == NULL) {
return root->left;
} else {
TreeNode* p = root->right;
while (p->left != NULL) {
p = p->left;
}
root->val = p->val;
root->right = deleteBST(root->right, p->val);
}
} else if (root->val > val) {
root->left = deleteBST(root->left, val);
} else {
root->right = deleteBST(root->right, val);
}
return root;
}
// 读入一串字符创建一棵二叉排序树
TreeNode* createBST() {
TreeNode* root = NULL;
int val;
while (cin >> val) {
root = insertBST(root, val);
}
return root;
}
int main() {
// 创建二叉排序树
TreeNode* root = createBST();
// 查找二叉排序树
int val1;
cout << "请输入要查找的值:";
cin >> val1;
if (searchBST(root, val1)) {
cout << "查找成功!" << endl;
} else {
cout << "查找失败!" << endl;
}
// 插入二叉排序树
int val2;
cout << "请输入要插入的值:";
cin >> val2;
root = insertBST(root, val2);
cout << "插入成功!" << endl;
// 删除二叉排序树
int val3;
cout << "请输入要删除的值:";
cin >> val3;
root = deleteBST(root, val3);
cout << "删除成功!" << endl;
return 0;
}
```
阅读全文
相关推荐











