C++ 二叉搜索樹【面試】

以下是一個(gè)簡單的二叉搜索樹實(shí)現(xiàn),包括插入和查找操作的示例代碼:

#include <iostream>

// 定義二叉搜索樹的節(jié)點(diǎn)結(jié)構(gòu)
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已經(jīng)存在,則不插入
        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);
        }
    }
};

// 面試時(shí),你可以解釋這段代碼,并討論二叉搜索樹的各種操作。
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;
}

二叉搜索樹的特點(diǎn):

  1. 有序性:對于BST中的任意節(jié)點(diǎn),其左子樹上所有節(jié)點(diǎn)的值均小于該節(jié)點(diǎn)的值,右子樹上所有節(jié)點(diǎn)的值均大于該節(jié)點(diǎn)的值。

  2. 二叉樹結(jié)構(gòu):每個(gè)節(jié)點(diǎn)最多有兩個(gè)子節(jié)點(diǎn),通常左子節(jié)點(diǎn)稱為左子樹,右子節(jié)點(diǎn)稱為右子樹。

  3. 動態(tài)數(shù)據(jù)結(jié)構(gòu):二叉搜索樹可以在運(yùn)行時(shí)動態(tài)地添加和刪除節(jié)點(diǎn)。

  4. 時(shí)間復(fù)雜度:在平衡的情況下,BST的查找、插入和刪除操作的時(shí)間復(fù)雜度為O(log n)。但在最壞的情況下(例如,樹退化為鏈表),時(shí)間復(fù)雜度為O(n)。

  5. 遍歷方式:BST可以通過中序遍歷(In-Order Traversal)來實(shí)現(xiàn)有序遍歷。

二叉搜索樹的實(shí)現(xiàn)要點(diǎn):

  1. 節(jié)點(diǎn)定義:通常使用一個(gè)結(jié)構(gòu)體或類來定義樹的節(jié)點(diǎn),包含數(shù)據(jù)域和指向左右子節(jié)點(diǎn)的指針。

  2. 插入操作:根據(jù)BST的特性,遞歸地將新節(jié)點(diǎn)插入到正確的位置。

  3. 查找操作:從根節(jié)點(diǎn)開始,根據(jù)目標(biāo)值與當(dāng)前節(jié)點(diǎn)值的比較結(jié)果,決定是向左子樹還是向右子樹搜索。

  4. 刪除操作:刪除節(jié)點(diǎn)稍微復(fù)雜,需要考慮三種情況:無子節(jié)點(diǎn)、有一個(gè)子節(jié)點(diǎn)、有兩個(gè)子節(jié)點(diǎn)。

  5. 平衡問題:為了保持BST的高效性,需要考慮平衡問題,可以使用AVL樹或紅黑樹等自平衡二叉搜索樹。

面試回答示例:

"二叉搜索樹是一種非常有效的數(shù)據(jù)結(jié)構(gòu),用于快速查找、插入和刪除操作。它的核心特點(diǎn)是每個(gè)節(jié)點(diǎn)的值都大于其左子樹上所有節(jié)點(diǎn)的值,小于其右子樹上所有節(jié)點(diǎn)的值。這保證了二叉搜索樹可以進(jìn)行中序遍歷,從而獲得有序的數(shù)據(jù)序列。

在實(shí)現(xiàn)BST時(shí),我們需要定義一個(gè)節(jié)點(diǎn)結(jié)構(gòu),包含數(shù)據(jù)域和指向左右子節(jié)點(diǎn)的指針。插入操作是通過遞歸地比較節(jié)點(diǎn)值來完成的。查找操作則是從根節(jié)點(diǎn)開始,根據(jù)目標(biāo)值與當(dāng)前節(jié)點(diǎn)值的比較結(jié)果,決定搜索的方向。

然而,如果不考慮平衡,二叉搜索樹在最壞的情況下可能會退化成鏈表,導(dǎo)致操作的時(shí)間復(fù)雜度退化為O(n)。為了解決這個(gè)問題,我們可以使用平衡二叉搜索樹,如AVL樹或紅黑樹,它們通過旋轉(zhuǎn)操作來保持樹的平衡,確保所有操作的時(shí)間復(fù)雜度接近O(log n)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容