91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++ 二叉搜索樹原理及其實現

發布時間:2020-08-05 12:30:51 來源:網絡 閱讀:251 作者:sonissa 欄目:編程語言

首先是概念:
二叉搜索樹又稱二叉排序樹,它具有以下的性質:

  • 若是左子樹不為空,則左子樹上所有節點的值小于根節點的值
  • 若是右子樹不為空,則右子樹上所有結點的值大于根節點的值
  • 二叉搜索樹的左右子樹也是二叉搜索樹
  • 二叉搜索樹的中序排列是一個有序數列

再下來是它的實現

首先是構造節點:

template<class K>
struct BStreeNode{
    BStreeNode(const K& date = K())    //節點的定義
    :leftC(nullptr),    // 初始化
    rightC(nullptr),
    date_(date)
    {}
    BStreeNode<K> *leftC;      //左孩子
    BStreeNode<K> *rightC;    //右孩子
    K date_;
};

二叉搜索樹類的實現:

template<class K>
class BStree{
    typedef BStreeNode<K> BsNode;
public:
    BStree() :
        _root(nullptr)    
    {}
    BsNode* Find(const K& date){       //查找節點
        BsNode* pNode = _root;
        while (pNode){
            if (pNode->date_ == date){
                return pNode;
            }
            else if (pNode->date_ > date){
                pNode = pNode->rightC;
            }
            else
                pNode = pNode->leftC;
        }
        return nullptr;
    }
    bool Insert(const K& date){
        BsNode *pNode = _root;
        BsNode *parent=nullptr;
        if (_root == nullptr){      //空樹時開辟空間定義為根節點
            _root = new BsNode(date);
            return true;
        }
        else if (Find(date)){   //存在相同結點不進行插入
            return false;
        }
        else{
            while (pNode){         //找到插入位置,但是這里循環結束后只確認了父母結點,是做左孩子還是右孩子不確認( 因為此時值為nullptr )
                parent = pNode;
                if (pNode->date_ > date){
                    pNode = pNode->leftC;
                }
                else{
                    pNode = pNode->rightC;
                }
            }
            pNode = new BsNode(date);    //構造結點
            if (parent->date_ > date){       //確認是做左孩子還是右孩子
                parent->leftC = pNode;
            }
            else{
                parent->rightC = pNode;
            }
            return true;
        }
    }

    bool Delete(const K& date){
        BsNode *pNode = _root;
        BsNode *parent = nullptr;
        if (pNode == nullptr){    //空樹情況
            return false;
        }
        while (pNode){      //找到要刪除的結點
            if (pNode->date_ == date){
                break;
            }
            else if (pNode->date_ < date){
                parent = pNode;
                pNode = pNode->rightC;
            }
            else{
                parent = pNode;
                pNode = pNode->leftC;
            }
        }
        //BsNode *pdel=pNode;
        if (pNode == parent){      //要刪除的點是根節點
            if (pNode->leftC){
                pNode = pNode->leftC;
            }
            else if (pNode->rightC){
                pNode = pNode->rightC;
            }
            else{
                pNode = nullptr;
            }
        }
        if (pNode == nullptr){   // 沒有找到要刪除的節點
            return false;
        }
        if (pNode->rightC && pNode->leftC == nullptr){  //結點只有右子樹
            if (pNode == parent->leftC){
                parent->leftC = pNode->rightC;
            }
            else{
                parent->rightC = pNode->rightC;
            }
        }
        else if (pNode->leftC && pNode->rightC == nullptr){   //結點只有左子樹
            if (pNode == parent->leftC){
                parent->leftC = pNode->leftC;
            }
            else{
                parent->rightC = pNode->leftC;
            }
        }
        else if (pNode->leftC && pNode->rightC){    //兒女俱全
            if (pNode == parent->leftC){   //要刪除的節點是父母節點的左孩子,刪除后的位置要由原先節點的右孩子替代
                pNode->rightC->leftC = pNode->leftC;
                parent->leftC = pNode->rightC;
            }
            else{
                pNode->leftC->rightC= pNode->rightC;  //要刪除的節點是父母節點的右孩子,刪除后的位置要由原先節點的左孩子替代
                parent->rightC = pNode->leftC;
            }
        }
        else{                                        //無子可依
            if (pNode == parent->leftC){
                parent->leftC = nullptr;
            }
            else{
                parent->rightC = nullptr;
            }
        }
        delete pNode;     //在連接完成后最后再進行刪除
        return true;
    }

    BsNode* IfLeftMost(){
        if (_root == nullptr){
            return nullptr;
        }
        BsNode *pNode = _root;
        while (pNode->leftC){
            pNode = pNode->leftC;
        }
        return pNode;
    }
    BsNode* IfRightMost(){
        if (_root == nullptr){
            return nullptr;
        }
        BsNode *pNode = _root;
        while (pNode->rightC){
            pNode = pNode->rightC;
        }
        return pNode;
    }
    void InOrder(){  //定義一個借口給外部調用,因為根節點在這里是private權限
        InOrder(_root);
        cout << endl;
    }

private:
    void InOrder(BsNode *pNode){    //二叉樹的中序遍歷,用來檢查結果(二叉搜索樹中序遍歷應該是一個有序序列)
        if (pNode){
            InOrder(pNode->leftC);
            cout << pNode->date_ << ' ';
            InOrder(pNode->rightC);
        }
    }
private:
    BsNode *_root;
};

測試函數這里就不提供了

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宾川县| 天峻县| 瓦房店市| 鸡西市| 河东区| 夏河县| 当雄县| 乐东| 德安县| 华亭县| 台南县| 福安市| 六枝特区| 武清区| 西青区| 财经| 泾川县| 临洮县| 普兰县| 华宁县| 蓝山县| 连云港市| 沭阳县| 内丘县| 台中市| 南江县| 宁乡县| 衡南县| 通州区| 海南省| 冀州市| 南召县| 邢台县| 新郑市| 南丹县| 浮山县| 商丘市| 徐闻县| 聂荣县| 山丹县| 怀柔区|