搜尋二叉樹的實現與效能分析

2021-09-19 12:02:53 字數 1583 閱讀 2985

#define _crt_secure_no_warnings 1

#includetemplatestruct bstnode

bstnode* _pleft;

bstnode* _pright;

t _data;

};templateclass bstree

~bstnode()

pnode find(const t& data)

else if (data > _proot->data)

else(data < _proot->data)

}return nullptr;

} bool insert(const t& data)

//樹不為空

//記錄cur的雙親,因為新元素最終插入在cur雙親左右孩子的位置

pnode parent = nullptr;

while (cur)

else if (cur->_data > data)

else

return false;

} //插入元素

cur = new node(data);

if (data < parent->_data)

else

return true;

} bool erase(const t& data)

else

}if (cur == nullptr)

return false;

//分以下幾種情況

if (cur->_pright == nullptr)

else

else

free(cur);}}

else if (cur->_pleft == nullptr)

else

else

free(cur);}}

else

return true;

} void inorder()

private:

void _inorder(pnode proot) }

void _destroy(pnode& proot) }

private:

pnode _proot;

};

1.插入和刪除都必須先查詢,查詢效率代表了搜尋二叉樹中各個操作的效能

2.對有n個節點的二叉搜尋樹,若每個元素的查詢概率相等,則二叉搜尋樹平均查詢長度是節點在二叉搜尋樹的深度的函式,即結點越深,比較次數越多。

3.但對於同乙個關鍵碼集合,如果各關鍵碼插入的次序不同,可能得到不同結構的二叉搜尋樹:

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

最差情況下,二叉搜尋樹為單支樹

如果退化成單支樹,二叉搜尋樹的效能就失去了。那能否進行改進,不論按照什麼次序插入關鍵碼,都可以是二叉搜尋樹的效能最佳?

(見下篇部落格)

Leetcode 搜尋二叉樹與完全二叉樹的判斷

搜尋二叉樹 中序遍歷為遞增序列,如果不是,返回false 完全二叉樹 層次遍歷中,不出現以下情況 bst判定 採取stack非遞迴實現 判斷是否為搜尋二叉樹 中序遍歷即可,若非遞增那麼不是 bool bstjudge treenode root else 已經到達最左邊葉子節點 return tru...

二叉樹 還原二叉樹 二叉搜尋樹

先序遍歷的特點 先遍歷根結點,再遍歷左子樹,最後再遍歷右子樹 中序遍歷的特點 先遍歷左子樹,再遍歷根結點,最後再遍歷右子樹 後序遍歷的特點 先遍歷左子樹,再遍歷右子樹,最後再遍歷根結點 舉例 先序遍歷 a b d f g h i e c 中序遍歷 f d h g i b e a c 如上,根據先序遍...

樹 二叉樹 二叉搜尋樹

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