什麼是二叉搜尋樹?
二叉搜尋樹又叫二叉排序樹,空樹是特殊的二叉搜尋樹。若左子樹不為空,那麼左子樹節點上的值都小於根節點的值;若右子樹不為空,那麼右子樹上所有節點的值都大於根節點的值;左右子樹也是二叉搜尋樹。
二叉搜尋樹的效能分析
對有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 解釋 輸入為 ...