資料結構學習筆記吧(11) 基於樹的查詢

2021-08-09 08:14:52 字數 1811 閱讀 2652

(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的結點...