(1)二叉排序樹定義:
該二叉樹或者是一棵空樹或者是一棵具有下列性質的樹:
1. 若他的左子樹非空,則左子樹上所有節點的值均小於根節點的值
2. 若他的右子樹非空,則右子樹上所有節點的值均大於(等於)根節點的值
3. 他的左子樹與與右子樹也分別是二叉排序樹
二叉排序樹的插入
思路:
1. 首先判斷二叉樹是否為空,若為空則可以直接把當做根節點
2. 若非空,則key與根節點進行比較
a. 如果key等於節點的值 則停止插入
b. 如果key大於節點的值 則插入根節點右邊
c. 如果key小於節點的值 則插入根節點左邊
**實現:
void insertbst(pbstnode *root,int key)
else
else
}}
二叉排序樹的建立void creatbst(pbstnode * root)
}
二叉排序樹的查詢
思路:
1. 首先判斷二叉樹是否為空,若為空則不可查詢
2. 若非空,則key與根節點進行比較
a. 如果key等於節點的值 則查詢成功
b. 如果key大於節點的值 則根節點右邊查詢
c. 如果key小於節點的值 則根節點左邊查詢
pbstnode bstsearch(pbstnode root,int key)
if (root->key == key)
else
if (root ->key < key)
else
}
二叉排序樹的刪除
在二叉排序樹刪去乙個結點,分三種情況討論:
1. 若*p結點為葉子結點,即pl(左子樹)和pr(右子樹)均為空樹。由於刪去葉子結點不破壞整棵樹的結構,則可以直接刪除此子結點。
2. 若*p結點只有左子樹pl或右子樹pr,此時只要令pl或pr直接成為其雙親結點*f的左子樹(當*p是左子樹)或右子樹(當*p是右子樹)即可,作此修改也不破壞二叉排序樹的特性。
3. 若*p結點的左子樹和右子樹均不空。在刪去*p之後,為保持其它元素之間的相對位置不變,可按中序遍歷保持有序進行調整,可以有兩種做法:
a:其一是令*p的左子樹為*f的左/右(依*p是*f的左子樹還是右子樹而定)子樹,*s為*p左子樹的最右下的結點,而*p的右子樹為*s的右子樹
b:其二是令*p的直接前驅(或直接後繼)替代*p,然後再從二叉排序樹中刪去它的直接前驅(或直接後繼)-即讓*f的左子樹(如果有的話)成為*p左子樹的最左下結點(如果有的話),再讓*f成為*p的左右結點的父結點。
**如下:
pbstnode delbst(pbstnode root, int key)
else
if (p->key > key)
else
}if (p ==
null)
if (p->lchild ==
null)
else
if (fa->lchild == p)
else
delete p;
}else
if (p == q)
else
p->key = s->key;
delete s;
}return root;
}
資料結構學習筆記 B B 樹
b 樹是一種非二叉的查詢樹,即一般化的bst,除了要滿足查詢樹的特性外,還滿足以下特性 一棵m階的b樹 所有的葉子節點位於同一層 如,m 3 b 樹的搜尋,從根結點開始,對結點內的關鍵字 有序 序列進行二分查詢,如果命中則結束,否則進入查詢關鍵字所屬範圍的兒子結點 重複,直到所對應的兒子指標為空,或...
資料結構學習 樹
樹結構是二叉樹的擴充套件,二叉樹在乙個節點上只有兩個子節點,而樹結構在乙個節點上不只有兩個,可以有n個,n大於等於0,更具有一般意義。二叉樹的概念同樣適用於樹,如完全數,滿樹等,此外還有 有序樹 結點的各子樹從左到右是有次序的,即若交換各子樹相對位置會構成不同的樹。無序樹 結點的各子樹從左到右是無次...
資料結構學習 樹
樹是n個結點的有限集合。n 0時稱為空樹,在任意一棵非空樹中 1 有且僅有乙個特定的稱為根的結點。2 當n 1時,其餘結點可以分為m個互不相交的有限集合,其中每乙個集合本身又是一棵樹。在此,我們主要來學習二叉樹的應用。結點擁有的子樹數稱為結點的度。度為0的結點稱為葉子結點或者終端結點。度不為0的結點...