【2020年山西大学真题】二叉树存储形式为(lchild,data,rchild),给出求二叉树的最大关键字
值的算法。
(1)给出算法的基本思想;
(2)根据设计思想,给出描述算法;
(3)分析所给算法的时间复杂度.
(1)二叉树的最大关键字值可以通过递归的方式来实现。基本思想是比较根节点的关键字值和左子树、右子树的最大关键字值,然后返回最大值。
以下是用C语言实现该算法的代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 二叉树结点的结构体定义
typedef struct TreeNode {
int data;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 递归求二叉树的最大关键字值
int findMax(TreeNode *root) {
if (root == NULL) {
return INT_MIN;
}
int max = root->data;
int leftMax = findMax(root->left);
int rightMax = findMax(root->right);
if (leftMax > max) {
max = leftMax;
}
if (rightMax > max) {
max = rightMax;
}
return max;
}
int main() {
// 创建一个二叉树
TreeNode* root = createNode(1);
root->left = createNode(2);
root->right = createNode(3);
root->left->left = createNode(4);
root->left->right = createNode(5);
root->right->left = createNode(6);
root->right->right = createNode(7);
// 求二叉树的最大关键字
int max = findMax(root);
printf("二叉树的深度为:%d\n", max);
return 0;
}
```
(2)在上述代码中,我们首先判断根节点是否为空,如果为空,则返回一个足够小的值(这里使用INT_MIN)。然后递归调用函数来求解左子树和右子树的最大关键字值。最后,比较根节点的关键字值和左、右子树的最大关键字值,返回最大值。
(3)算法的时间复杂度是 O(n),其中 n 是二叉树的节点数量。因此,该算法的时间复杂度是线性的,与二叉树的规模成正比。