#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 解釋 輸入為 ...