21.树:返回最大最小值

一. 使用递归函数

最大值:一直往右边走

最小值:一直往左边走

为什么一直往一边走就可以了?因为之前二叉搜索树已经排列好顺序了。

#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); // 递归
}

二. 运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值