二叉搜尋樹
平衡二叉搜尋樹
二叉樹的儲存方式
二叉樹的遍歷方式
二叉樹的**描述
總結參考文獻
開啟演算法新征程,為了讓我對二叉樹有新層次的理解,加油學習吧。
二叉樹的兩種形式:滿二叉樹和完全二叉樹
只有度為0和度為2的節點的樹,並且度為0的結點在同一層上,則這棵二叉樹為滿二叉樹。
如下圖:
深度:k
節點個數:2^k-1
除了最底層的節點沒有安排滿外,其餘每層節點數都達到最大值,並且最下面一層節點都集中在該層最左的若干位置。若最底層為第 h 層,則該層包含 1~ 2h 個節點。
要注意完全二叉樹的樣子:
ps:優先佇列其實是乙個堆,堆就是一顆完全二叉樹,同時保證父子節點的順序關係。
前面介紹的樹,都是沒有數值的。而二叉搜尋樹,是有數值的。而且二叉搜尋樹,是乙個有序樹。
它有以下特點:
若它的左子樹不為空,則左子樹上所有節點的值,均小於它的根節點的值。
若它的右子樹不為空,則右子樹上所有節點的值,均大於它的根節點的值。
它的左、右子樹也分別是二叉排序樹。
如下圖,兩個都是搜尋樹:
性質:它是一棵空樹,或者它的左右兩個子樹的高度差的絕對值不超過1,並且兩個子樹都是一棵平衡二叉樹。
如下圖:
可以看出,最後一棵樹,左右子樹高度差超過了1。
重點來了:
c++中map、set、multimap,multiset的底層實現都是平衡二叉搜尋樹
所以map、set的增刪操作時間時間複雜度是logn。
unordered_map、unordered_map底層實現是雜湊表。
二叉樹可以鏈式儲存,也可以順序儲存
鏈式儲存,用指標;順序儲存,用陣列。
鏈式儲存,如下圖:
用陣列儲存的順序儲存如下圖:
它的節點如何遍歷?
如果父節點的陣列下表是i,那麼它的左孩子就是i * 2 + 1,右孩子就是 i * 2 + 2。
但是用鏈式表示的二叉樹,更有利於我們理解,所以一般我們都是用鏈式儲存二叉樹。
深度優先遍歷:先往深走,遇到葉子節點再往回走。
廣度優先遍歷:一層一層的去遍歷。
這兩種遍歷是圖論中最基本的兩種遍歷方式。
如下圖:
之前我們講棧與佇列的時候,就說過棧其實就是遞迴的一種是實現結構,
也就說前中後序遍歷的邏輯其實都是可以借助棧使用非遞迴的方式來實現的。
而廣度優先遍歷的實現一般使用佇列來實現,這也是佇列先進先出的特點所決定的,
因為需要先進先出的結構,才能一層一層的來遍歷二叉樹。
這裡其實我們又了解了棧與佇列的乙個應用場景了。
c++**如下:
struct treenode
};
二叉樹的定義 和鍊錶是差不多的,相對於鍊錶 ,二叉樹的節點裡多了乙個指標, 有兩個指標,指向左右孩子.
二叉樹是一種基礎資料結構,在演算法面試中都是常客,也是眾多資料結構的基石。
本篇介紹了二叉樹的種類、儲存方式、遍歷方式以及**描述,比較全面的介紹了二叉樹各個方面的重點。
關於二叉樹,你該了解這些!
關於sql注入的一些個人心得
sql 注入就是通過使用者提交的資料中加入一些特殊字元如單引號等來影響sql命令的行為 這些網上都有很多說明,只要搜一下都會有很多。好一點的會知道通過表單提交的資料來注入,很少有人會注意到通過一些隱藏的域或都不可輸入的表單項來注入 其實像checkbox radio 這樣的表單元素都是可以用來作為s...
二叉樹 48 二叉樹 二叉樹的高度
目的 使用c 模板設計並逐步完善二叉樹的抽象資料型別 adt 內容 1 請參照鍊錶的adt模板,設計二叉樹並逐步完善的抽象資料型別。由於該環境目前僅支援單檔案的編譯,故將所有內容都集中在乙個原始檔內。在實際的設計中,推薦將抽象類及對應的派生類分別放在單獨的標頭檔案中。參考教材 課件,以及網盤中的鍊錶...
二叉樹學習
二叉樹的遞迴思想是一大難點。自認為是容易遺忘的東西。簡單問題 求n result n n 1 n 2 1 自然迴圈可以解決問題 int i,result result n for i n 1 i 0 i 遞迴的寫法就是 int fibonacci1 int n 很明顯的特點是 1.有乙個退出函式的條...