C 二叉查詢樹

2021-08-22 10:25:37 字數 2845 閱讀 1666

二叉排序樹(binary sort tree),又稱二叉查詢樹(binary search tree),亦稱二叉搜尋樹。

二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹:

(1)若左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值;

(2)若右子樹不空,則右子樹上所有結點的值均大於或等於它的根結點的值;

(3)左、右子樹也分別為二叉排序樹;

若根結點的關鍵字值等於查詢的關鍵字,成功。

否則,若小於根結點的關鍵字值,遞迴查左子樹。

若大於根結點的關鍵字值,遞迴查右子樹。

若子樹為空,查詢不成功。

平均情況分析(在成功查詢兩種的情況下):

在一般情況下,設 p(n,i)為它的左子樹的結點個數為 i 時的平均查詢長度。如圖的結點個數為 n = 6 且 i = 3; 則 p(n,i)= p(6, 3) = [ 1+ ( p(3) + 1) * 3 + ( p(2) + 1) * 2 ] / 6= [ 1+ ( 5/3 + 1) * 3 + ( 3/2 + 1) * 2 ] / 6

注意:這裡 p(3)、p(2) 是具有 3 個結點、2 個結點的二叉分類樹的平均查詢長度。 在一般情況,p(i)為具有 i 個結點二叉分類樹的平均查詢長度。平均查詢長度= 每個結點的深度的總和 / 總結點數

(上圖應為左子樹p(3),右子樹p(2))

p(3) = (1+2+2)/ 3 = 5/3

p(2) = (1+2)/ 2 = 3/2∴ p(n,i)= [ 1+ ( p(i) + 1) * i + ( p(n-i-1) + 1) * (n-i-1) ] / n

∴ p(n)=

p(n,i)/ n <= 2(1+i/n)lnn

因為 2(1+i/n)lnn≈1.38logn 故p(n)=o(logn)

編輯在二叉排序樹刪去乙個結點,分三種情況討論:

若*p結點為葉子結點,即pl(左子樹)和pr(右子樹)均為空樹。由於刪去葉子結點不破壞整棵樹的結構,則可以直接刪除此子結點。

若*p結點只有左子樹pl或右子樹pr,此時只要令pl或pr直接成為其雙親結點*f的左子樹(當*p是左子樹)或右子樹(當*p是右子樹)即可,作此修改也不破壞二叉排序樹的特性。

若*p結點的左子樹和右子樹均不空。在刪去*p之後,為保持其它元素之間的相對位置不變,可按中序遍歷保持有序進行調整,可以有兩種做法:

其一是令*p的左子樹為*f的左/右(依*p是*f的左子樹還是右子樹而定)子樹,*s為*p左子樹的最右下的結點,而*p的右子樹為*s的右子樹;

其二是令*p的直接前驅(或直接後繼)替代*p,然後再從二叉排序樹中刪去它的直接前驅(或直接後繼)-即讓*f的左子樹(如果有的話)成為*p左子樹的最左下結點(如果有的話),再讓*f成為*p的左右結點的父結點。

using system;

public class binarysearchtree }/*

* 前序遍歷

若二叉樹非空,則執行以下操作:

(01) 訪問根結點;

(02) 先序遍歷左子樹;

(03) 先序遍歷右子樹。

引數為節點,首先列印值,在按照根左右遍歷

*/private void preorder(bstnodetree)

}//無引數直接遍歷根節點

public void preorder()

/*中序遍歷

若二叉樹非空,則執行以下操作:

(01) 中序遍歷左子樹;

(02) 訪問根結點;

(03) 中序遍歷右子樹。

遞迴遍歷,直接遍歷最左端的節點,在列印節點值

* */

private void inorder(bstnodetree)

}public void inorder()

/*後序遍歷

若二叉樹非空,則執行以下操作:

(01) 後序遍歷左子樹;

(02) 後序遍歷右子樹;

(03) 訪問根結點。

*/private void postorder(bstnodetree)

}public void postorder()

/** (遞迴實現)查詢"二叉樹x"中鍵值為key的節點

*/private bstnodesearch(bstnodex, t key)

public bstnodesearch(t key)

/** (非遞迴實現)查詢"二叉樹x"中鍵值為key的節點

*/private bstnodeiterativesearch(bstnodex, t key)

return x;

}public bstnodeiterativesearch(t key)

/* * 查詢最大結點:返回tree為根結點的二叉樹的最大結點。

*/private bstnodemaximum(bstnodetree)

public t maximum()

/* * 查詢最小結點:返回tree為根結點的二叉樹的最小結點。

*/private bstnodeminimum(bstnodetree)

public t minimum()

/* * 找結點(x)的前驅結點。即,查詢"二叉樹中資料值小於該結點"的"最大結點"。

*/public bstnodepredecessor(bstnodex)

return y;

}/*

* 找結點(x)的後繼結點。即,查詢"二叉樹中資料值大於該結點"的"最小結點"。

*/public bstnodesuccessor(bstnodex)

return y;}}

二叉查詢樹 C

include stdafx.h include using namespace std 二叉查詢樹的性質 1.二叉排序樹或為空樹 2.若左子樹不為空,則左子樹中所有節點的值均小於或等於根節點 3.若右子樹不為空,則右子樹中所有節點的值均大於或等於跟節點 4.左右子樹也為二叉排序樹 5.二叉排序樹採...

二叉查詢樹 c

遞迴定義 標頭檔案實現檔案 1.結構體定義 2.查詢函式 3.查詢關鍵值最小的結點 4.查詢關鍵值最大的結點 5.插入函式 6.刪除函式 7.其他函式 makeempty,retrive 二叉查詢樹 binary search tree,bst 在不同的書上我發現也可以叫二叉搜尋樹,二叉排序樹。二叉...

二叉樹 二叉查詢樹

構建二叉樹,判斷是否為二叉查詢樹,遞迴先序遍歷,非遞迴中序遍歷 include include include include using namespace std 二叉樹結點 struct treenode 鍊錶結點 struct listnode struct tempnodetempnode...