一. 使用递归函数
最大值:一直往右边走
最小值:一直往左边走
为什么一直往一边走就可以了?因为之前二叉搜索树已经排列好顺序了。
#include <iostream>
#include <stdbool.h>
using namespace std;
struct BstNode
{
int data;
BstNode *left;
BstNode *right;
};
BstNode *GetNewNode(int data);
BstNode *Insert(BstNode *root, int data);
bool Search(BstNode *root, int data);
int FindMin(BstNode *root); // 找出最小值
int FindMax(BstNode *root); // 找出最大值
int main()
{
BstNode *root = NULL; // 分配一个树为root
root = Insert(root, 15);
root = Insert(root, 10);
root = Insert(root, 20);
root = Insert(root, 40);
int number;
number = FindMin(root); // 查找出最小值并返回
cout << "FindMin value is " << number << endl;
number = FindMax(root); // 查找出最大值并返回
cout << "FindMax value is " << number << endl;
return 0;
}
BstNode *GetNewNode(int data) // 获取当前值
{
BstNode *newNode = new BstNode(); // 在堆上分配内存空间
newNode->data = data; // 将newNode的data设置为当前data
newNode->left = newNode->right = NULL; // 设置初始为NULL
return newNode;
}
BstNode *Insert(BstNode *root, int data)
{
if (root == NULL)
{
root = GetNewNode(data); // 因为这里修改了指针指向,所以要返回新指针
return root;
}
else if (data <= root->data) // 插入值小于根节点,那就插左边
{
root->left = Insert(root->left, data); // 递归函数,自动往下进行,后续会进行返回,返回的结果赋值为该层root的left
}
else if (data > root->data) // 插入值大于根节点,那就插右边
{
root->right = Insert(root->right, data); // 递归函数,自动往下进行
}
return root;
}
bool Search(BstNode *root, int data)
{
if (root == NULL) // 空树访问不了
return false;
else if (root->data == data)
return true;
else if (data <= root->data)
return Search(root->left, data);
else if (data > root->data)
return Search(root->right, data);
return false;
}
int FindMin(BstNode *root)
{
if (root == NULL)
{
cout << "Error :Tree is empty" << endl;
return -1;
}
else if (root->left == NULL) // 退出条件:下个元素不为NULL
{
return root->data;
}
return FindMin(root->left); // 递归
}
int FindMax(BstNode *root)
{
if (root == NULL)
{
cout << "Error :Tree is empty" << endl;
return -1;
}
else if (root->right == NULL) // 退出条件:下个元素不为NULL
{
return root->data;
}
return FindMax(root->right); // 递归
}