二叉搜尋樹

2021-09-25 23:58:39 字數 3230 閱讀 5237

什麼是二叉搜尋樹?

二叉搜尋樹又叫二叉排序樹,空樹是特殊的二叉搜尋樹。若左子樹不為空,那麼左子樹節點上的值都小於根節點的值;若右子樹不為空,那麼右子樹上所有節點的值都大於根節點的值;左右子樹也是二叉搜尋樹。

二叉搜尋樹的效能分析

對有n個結點的二叉搜尋樹,若每個元素查詢的概率相等,則二叉搜尋樹平均查詢長度是結點在二叉搜尋樹的深度的函式,即結點越深,則比較次數越多。但對於同乙個關鍵碼集合,如果各關鍵碼插入的次序不同,可能得到不同結構的二叉搜尋樹。

最優情況下,二叉搜尋樹為完全二叉樹,其平均比較次數為:log2n

最差情況下,二叉搜尋樹退化為單支樹,其平均比較次數為:n/2

二叉搜尋樹節點的結構定義

template struct bstreenodeplus 

};

二叉搜尋樹的實現

template class bstreeplus 

//插入乙個節點

bool insert(const t& x)

//樹不為空,要找合適的位置插入,從根節點開始匹配

node* cur = _root;

//要記錄每一步走的前乙個位置

node* parent = nullptr;

while (cur)

else if (cur->_data < x)

else

} cur = new node(x);

//插入元素

if (parent->_data < x)

parent->_right = cur;

else

parent->_left = cur;

return true;

} bool find(const t& x)

}return false;

} //刪除乙個節點 分兩步

//第一步 :找到這個節點的位置

//第二步:刪除 刪除又分為三種情況

bool erase(const t& x)

else if (cur->_data < x)

else

else

}//右子樹為空的情況

else if (cur->_right = nullptr)

else

}//左右子樹都不為空

//不能直接刪除,找乙個節點替代它,左子樹最大,右子樹最小

else

找到右子樹最小的元素

將這個元素直接賦值給要刪除的元素

//cur->_data = replace->_data;

//del = replace;

//if (reparent->_left == replace)

// reparent->_left = replace->_right;

//else

// reparent->_right = replace->_right;

////找左子樹的最大節點

node* del = nullptr;

node* reparent = cur;

node* replace = cur->_left;

while (replace->_right)

cur->_data = replace->_data;

del = replace;

if (replace == reparent->_right)

reparent->_right = replace->_left;

else

reparent->_left = replace->_left;

}break;}}

return false;

} //遞迴呼叫,提供介面

void inorder()

void _inorder(node* root) }

private:

node* _root;

};

另一種寫法:插入pair,原理和上面一樣

#pragma once

#include using namespace std;

template struct bstreenode

};templateclass bstree

bool insert(const pair& kv)

node* cur = _root;

node* parent = nullptr;

while (cur)

else if (cur->_kv.first > kv.first)

else

} cur = new node(kv);

if (parent->_kv.first < kv.first)

parent->_right = cur;

else

parent->_left = cur;

return true;

} bool find(const k& key)

node* cur = _root;

while (cur)

return false;

} bool earse(const k& key)

else if (cur->_kv.first < key)

else

else

}else if (cur->_right == nullptr)

else

}//左右子樹都不為空的情況

else

//把代替節點賦值給要(原)刪除的節點

cur->_kv = replace->_kv;

del = replace;

if (rparent->_left == del)

rparent->_left = del->_right;

else

rparent->_right = del->_right;

}break;

}} return false;

} void inorder()

void _inorder(node* root) }

private:

node* _root;

};

二叉搜尋樹 二叉搜尋樹

題目 二叉搜尋樹 time limit 2000 1000 ms j a others memory limit 32768 32768 k j a others total submission s 6945 accepted submission s 3077 problem descripti...

二叉搜尋樹 修剪二叉搜尋樹

第一反應是重構,看來別人的解答發現,其實不用重構那麼複雜。treenode trimbst treenode root,int low,int high if root val high 下一層處理完左子樹的結果賦給root left,處理完右子樹的結果賦給root right。root left ...

樹 二叉樹 二叉搜尋樹

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 13輸出 true 示例 2 輸入 5 14 3 6輸出 false 解釋 輸入為 ...