結點:指樹中的一個元素;
結點的度:指結點擁有的子樹的個數,二叉樹的度不大於2。
數的度:指樹中的最大結點度數。
葉子:度爲0的結點,也稱爲終端結點。
高度:葉子節點的高度爲1,根節點高度最高。
層:根在第一層,以此類推。數據結構
二叉樹的第i層上至多有2^(i-1)個結點。函數
深度爲k的二叉樹,至多有2^k-1個結點。
滿二叉樹:葉子節點必定要在最後一層,而且全部非葉子節點都存在左孩子和右孩子。
最特別的二叉樹:徹底二叉樹:從左到右、從上到下構建的二叉樹。性能
非空二叉樹上的葉子結點數等於度爲2的結點數加1,即n0=n2+1。指針
結點 i 的子結點爲2i 和 2i+1(前提是都小於總結點數)。code
結點 i 的父結點爲 i/2。對象
二叉樹結點的各類遍歷序列,其實質是對一個非線性結構進行線性化的操做,使這個訪問序列中的每一個結點(第一個和最後一個除外)都有一個直接前驅和直接後繼。
傳統的鏈式存儲僅能體現一種父子關係,不能直接獲得結點在遍歷中的前驅和後繼。引入線索二叉樹是爲了加快查找結點前驅和後繼的速度。
在二叉樹線索化時,一般規定:若無左子樹,令lchild指向其前驅結點,若無右子樹,令rchild指向其後繼結點。還須要增長兩個標誌域代表當前指針域所指對象是指向左(右)子結點仍是指向直接前驅(後繼)。blog
二叉排序樹(BST),也稱二叉查找樹。它是一棵空樹,或者知足:
(1)若左子樹非空,左子樹上全部結點關鍵字值均小於根結點
(2)若右子樹非空,右子樹上全部結點關鍵字值均大於根結點
(3)左、右子樹也均爲二叉排序樹
二叉排序樹是一個遞歸的數據結構。對二叉排序樹進行中序遍歷,能夠獲得一個遞增的有序序列。排序
平衡二叉樹(AVL),是爲了不樹的高度增加過快,下降二叉排序樹的性能。規定在插入和刪除二叉樹結點時,保證任意結點的左、右子樹高度差的絕對值不超過1。遞歸
插入後判斷是否有結點所以次操做不平衡。先找到插入路徑上離插入結點最近的平衡因子絕對值大於1的結點A,再對以A爲根的子樹,在保持二叉排序樹特性的前提下,調整各結點的關係。思維導圖
哈希函數的選擇原則:
若哈希函數是一個一一對應的函數,則在查找時,只須要根據哈希函數對給定關鍵字的某種運算獲得待查找結點的存儲位置,無需進行比較。
通常狀況下,散列表的空間要比結點的集合大,雖然浪費了一部分空間可是卻提升了查找的效率,散列表空間爲m,填入表中結點數爲n,則比值n/m成爲哈希表的裝填因子,通常取0.65~0.9之間。
哈希函數應當儘可能簡單,其值域必須在表長的範圍以內,儘可能不要產生「衝突」(兩個關鍵字獲得相同的哈希地址)。
重點:
如何處理哈希衝突:
二叉排序樹的刪除操做:
1.
刪除操做較複雜須要分三中狀況:
(1)刪除節點的左孩子爲空
(2)刪除節點的右孩子爲空
(3)刪除節點有左右子樹
2.
函數須要用到&符號,這須要對實參進行刪除。
3.
申請空間後刪除記得使用free()。
4.
代碼實現:
void DeleteNode(BTree& T, int x) { if (T == NULL) return; if (x > T->data) DeleteNode(T->rchild, x); else if (x < T->data) DeleteNode(T->lchild, x); else { if (T->lchild == NULL) 刪除節點的左孩子爲空 { BTree temp = T; T = T->rchild; free(temp); } else if (T->rchild == NULL) 刪除節點的右孩子爲空 { BTree temp = T; temp = temp->rchild; free(temp); } else 刪除節點有左右子樹 { BTree pre, temp; pre = T; temp = T->lchild; { pre = temp; temp = temp->rchild; } T->data = temp->data; if (pre != T) pre->rchild = temp->lchild; else pre->lchild = temp->lchild; free(temp); } } }