C++ 二叉搜索树【面试】

以下是一个简单的二叉搜索树实现,包括插入和查找操作的示例代码:

复制代码
#include <iostream>

// 定义二叉搜索树的节点结构
struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;

    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

// 二叉搜索树类
class BinarySearchTree {
public:
    BinarySearchTree() : root(nullptr) {}

    // 插入操作
    void insert(int val) {
        root = insertRecur(root, val);
    }

    // 查找操作
    bool find(int val) const {
        return findRecur(root, val) != nullptr;
    }

private:
    TreeNode *root;

    // 递归插入操作
    TreeNode* insertRecur(TreeNode* node, int val) {
        if (!node) {
            return new TreeNode(val);
        }
        if (val < node->val) {
            node->left = insertRecur(node->left, val);
        } else if (val > node->val) {
            node->right = insertRecur(node->right, val);
        }
        // 如果val已经存在,则不插入
        return node;
    }

    // 递归查找操作
    TreeNode* findRecur(TreeNode* node, int val) const {
        if (!node || node->val == val) {
            return node;
        }
        if (val < node->val) {
            return findRecur(node->left, val);
        } else {
            return findRecur(node->right, val);
        }
    }
};

// 面试时,你可以解释这段代码,并讨论二叉搜索树的各种操作。
int main() {
    BinarySearchTree bst;
    bst.insert(50);
    bst.insert(30);
    bst.insert(20);
    bst.insert(40);
    bst.insert(70);
    bst.insert(60);
    bst.insert(80);

    if (bst.find(60)) {
        std::cout << "Found 60 in the BST." << std::endl;
    } else {
        std::cout << "60 is not in the BST." << std::endl;
    }

    return 0;
}

二叉搜索树的特点:

  1. 有序性:对于BST中的任意节点,其左子树上所有节点的值均小于该节点的值,右子树上所有节点的值均大于该节点的值。

  2. 二叉树结构:每个节点最多有两个子节点,通常左子节点称为左子树,右子节点称为右子树。

  3. 动态数据结构:二叉搜索树可以在运行时动态地添加和删除节点。

  4. 时间复杂度:在平衡的情况下,BST的查找、插入和删除操作的时间复杂度为O(log n)。但在最坏的情况下(例如,树退化为链表),时间复杂度为O(n)。

  5. 遍历方式:BST可以通过中序遍历(In-Order Traversal)来实现有序遍历。

二叉搜索树的实现要点:

  1. 节点定义:通常使用一个结构体或类来定义树的节点,包含数据域和指向左右子节点的指针。

  2. 插入操作:根据BST的特性,递归地将新节点插入到正确的位置。

  3. 查找操作:从根节点开始,根据目标值与当前节点值的比较结果,决定是向左子树还是向右子树搜索。

  4. 删除操作:删除节点稍微复杂,需要考虑三种情况:无子节点、有一个子节点、有两个子节点。

  5. 平衡问题:为了保持BST的高效性,需要考虑平衡问题,可以使用AVL树或红黑树等自平衡二叉搜索树。

面试回答示例:

"二叉搜索树是一种非常有效的数据结构,用于快速查找、插入和删除操作。它的核心特点是每个节点的值都大于其左子树上所有节点的值,小于其右子树上所有节点的值。这保证了二叉搜索树可以进行中序遍历,从而获得有序的数据序列。

在实现BST时,我们需要定义一个节点结构,包含数据域和指向左右子节点的指针。插入操作是通过递归地比较节点值来完成的。查找操作则是从根节点开始,根据目标值与当前节点值的比较结果,决定搜索的方向。

然而,如果不考虑平衡,二叉搜索树在最坏的情况下可能会退化成链表,导致操作的时间复杂度退化为O(n)。为了解决这个问题,我们可以使用平衡二叉搜索树,如AVL树或红黑树,它们通过旋转操作来保持树的平衡,确保所有操作的时间复杂度接近O(log n

相关推荐
ting94520004 小时前
Humalike X Hermes 深度技术剖析:单指令注入群聊社交智能的底层架构、算法与跨 IM 平台实现
人工智能·算法·架构
豆沙沙包?4 小时前
C++~~~stack容器、queue容器、list容器(p45-P56)
c++·windows·list
吴声子夜歌4 小时前
Java面试——算法
java·算法·面试
Frank_refuel4 小时前
【C++八股】面向对象
开发语言·c++
h_a_o777oah5 小时前
【图论】Tarjan 缩点:解决有向图中环的问题
c++·算法·图论·acm·强连通分量·缩点·tarjan
Tisfy5 小时前
LeetCode 1386.安排电影院座位:哈希表+位运算
算法·leetcode·散列表·题解·哈希表
Nil2085 小时前
leetcode 199二叉树的右视图
算法·leetcode·深度优先
M78佐菲6 小时前
c语言学习笔记:排序与查找方法整理
linux·c语言·笔记·学习·算法
别动我齐刘海7 小时前
机器人运动控制学习4——状态估计 State Estimation
c++·人工智能·学习·目标检测·机器学习·机器人·自动驾驶
学习星球7 小时前
OpenHarness 全面配置教学——从游戏开发工作流引入
c++·游戏·ai·ai编程