二叉排序(查詢,搜尋)樹詳解

2022-06-01 03:09:08 字數 1727 閱讀 5618

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

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

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

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

一,儲存方式

按二叉樹的儲存方式,定義乙個結構體,包含節點的值,指向左右子樹的指標;

typedef struct treenodebstree;

二,初始化函式

bstree *bstreeinsert(bstree *root,int n)

p=(bstree*)malloc(sizeof(bstree));

p->x=n;

p->lchild=p->rchild=null;

if(root==null)root=p;

else if(q->x>n)q->lchild=p;

else q->rchild=p;

return root;

}bstree *creatbstree(int a,int n)

}

四,查詢

簡單,無需解釋,直接上**

bstree* bstreeserch(bstree* root,int k)

} return null;

}

五,刪除結點(難點)

刪除結點要保證刪除後的樹仍然為一顆二叉查詢樹,即每乙個結點都大於其左子樹,小於其右子樹;

理論上分為三種情況:

(1)要刪除的結點為葉子結點(無左右子數);

直接刪除;

(2)要刪除的結點有左子樹或者有右子樹;

將要刪除結點的左子樹或者右子樹變為要刪除結點前驅(雙親)的左子樹或者右子樹,並刪除結點;

(3)有左右子樹;

用左子樹中最大的數取代要刪除結點的值並刪除最大數所在的結點

或者用右子樹中最小的數代替要刪除結點的值並刪除最下的數所在的結點;

實際實現:

(一)無左子樹;

(1)是根節點:根節點直接指向其右子樹;

(2)不是根節點:若要刪除的結點為其前驅結點(雙親結點)的左子結點,其前驅結點(雙親結點)的左子節點指向要刪除結點的左子節點,若要刪除結點為其前驅結點(雙親結點)的右子結點,其前驅結點(雙親結點)的右子結點指向要刪除結點的左子節點。

(二)有右子樹;

用左子樹中最大的數取代要刪除結點的值並刪除最大數所在的結點,因為每個結點都小於其右子結點,所以最大的數所在的結點無右子結點,而其左子樹也是最大數所在結點的前驅結點(雙親結點)的右子樹的一部分(都大於雙親結點的值)所以如果最大值所在的結點有左子樹的話,直接把其左子樹接到其前驅結點(雙親結點)的右子結點;

具體**:

bstree* bstreedelete(bstree* root,int n) 

if(p==null)return root;//找不到就返回

if(p->lchild==null)else

if(q==p)p->lchild=s->lchild;//未進入while迴圈,s為p左子樹,s無右子樹.將s的左子樹連到q上

else q->rchild=s->lchild;

p->x=s->x;

free(s);

} return root;

}

二叉排序樹 二叉搜尋樹 二叉查詢樹

特點 結構體定義struct node 建樹 建二叉排序樹 void create node root,int t else if t root data create root lc,t else create root rc,t 前序遍歷 層序 字典序 int flag int pre 1001...

二叉排序樹(二叉查詢樹 二叉搜尋樹)

include include typedef struct node node node createnode int value void addnode node root,int value else else void middleorder node node middleoder no...

手寫二叉排序樹(二叉查詢樹 二叉搜尋樹)

在二叉排序樹中,每個根節點只能有左右兩個子節點,左子節點比根節點小,右子節點比根節點大 treeset中不允許出現相同元素。一些場景下,如果子節點和根節點相同會將子節點放到根節點的右邊 二叉搜尋樹 public class binarysearchtreeextends comparable els...