4.关键字按顺序输入,输入序列为(zero,one,two,three,four,five,six,seven,eight,nine)。请通过比较字符串大小,完成二叉排序树的创建。并求出该树的度,分支结点,和内部结点。
以下是C++代码实现:
#include <iostream>
#include <string>
using namespace std;
// 二叉搜索树节点定义
struct BinarySearchTree {
string data;
BinarySearchTree* left;
BinarySearchTree* right;
};
// 创建二叉搜索树
BinarySearchTree* createSearchTree(string arr[], int n) {
BinarySearchTree* root = NULL;
for (int i = 0; i < n; i++) {
BinarySearchTree* node = new BinarySearchTree;
node->data = arr[i];
node->left = NULL;
node->right = NULL;
if (root == NULL) {
root = node;
} else {
BinarySearchTree* cur = root;
while (cur != NULL) {
if (node->data < cur->data) {
if (cur->left == NULL) {
cur->left = node;
break;
} else {
cur = cur->left;
}
} else {
if (cur->right == NULL) {
cur->right = node;
break;
} else {
cur = cur->right;
}
}
}
}
}
return root;
}
// 计算度、分支结点和内部结点的数量
void calculate(BinarySearchTree* root, int& degree, int& branch, int& internal) {
if (root == NULL) {
return;
}
if (root->left != NULL && root->right != NULL) {
degree = 2;
branch++;
internal++;
calculate(root->left, degree, branch, internal);
calculate(root->right, degree, branch, internal);
} else if (root->left != NULL) {
degree = 1;
branch++;
internal++;
calculate(root->left, degree, branch, internal);
} else if (root->right != NULL) {
degree = 1;
branch++;
internal++;
calculate(root->right, degree, branch, internal);
} else {
degree = 0;
internal++;
}
}
int main() {
string arr[] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
int n = sizeof(arr) / sizeof(arr[0]);
BinarySearchTree* root = createSearchTree(arr, n);
int degree = 0;
int branch = 0;
int internal = 0;
calculate(root, degree, branch, internal);
cout << "Degree: " << degree << endl;
cout << "Branch nodes: " << branch << endl;
cout << "Internal nodes: " << internal << endl;
return 0;
}
该程序创建了一个二叉搜索树,节点中存储了输入的关键字。通过字符串的比较,每个关键字会被插入到正确的位置上。然后,通过递归遍历二叉树,计算树的度、分支结点和内部结点的数量。