设计算法,对给定的二叉排序树,求出在等概论情况下的平均查找长度。用C++语言写出算法
时间: 2024-03-16 11:46:32 浏览: 59
以下是对给定的二叉排序树求出在等概论情况下的平均查找长度的算法,使用了递归实现:
```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,最后求和并除以节点个数即可得到平均查找长度。
阅读全文