資料結構和演算法 二叉排序樹

2021-07-25 23:55:10 字數 2358 閱讀 4268

對於無序的序列「62,58,88,47,73,99,35,51,93,29,37,49,56,36,48,50」,是否存在一種高效的查詢方案,使得能夠快速判斷在序列中是否存在指定的數值?二叉排序樹是一種簡單,高效的資料結構。

二叉排序樹,又稱為二叉查詢樹。二叉排序樹或者是一棵空樹,或者是具有以下性質的二叉樹:若其左子樹不為空,則左子樹上的所有節點的值均小於它的根結點的值;若其右子樹不為空,則右子樹上的所有節點的值均大於它的根結點的值;左右子樹又分別是二叉排序樹。

對於以上的序列,我們構建如下的二叉排序樹,其左子樹小於根結點的值,右子樹大於根結點的值:

二叉排序樹的結構為:

typedef struct tree_node*node, binode;
在二叉排序樹中,其最主要的特點是其左子樹小於其根結點的值,右子樹大於根結點的值。

二叉排序樹的查詢是指在二叉排序樹中查詢到對應的值,如在上述的二叉排序樹中查詢「49」,其具體過程為:

其具體過程如下圖所示:

其具體實現過程為:

int search_value(node root, double a, node *p)

else

if (a == root->value) else

if (a < root->value) else

}

對於插入操作,主要分為兩種情況:

插入的具體操作是判斷與二叉排序樹中節點的值,若小於當前節點的值,則選擇左子樹插入,若大於當前節點的值,則選擇右子樹插入;對於左右子樹,進行同樣的操作。

其實現過程為:

int insert_tree(node *root, double a)else else

}return

0; }

return

1;}

二叉排序樹中節點的刪除操作相比其他的操作就比較複雜一點,首先,通過查詢二叉排序樹中是否存在節點,若存在,主要分為如下的三種情況:

刪除的方法:設定父節點指向該節點的指標為空,直接刪除該節點。如刪除值為「50」的節點:

刪除的方法:刪除該節點,以其左子樹或者右子樹代替該節點。如刪除值為「58」的節點:

刪除的方法:

其具體的過程為:

int delete_node(node *root, double a)else

if (q->left ==

null

&& q->right ==

null)else

if ((q->left ==

null

&& q->right !=

null) || (q->left !=

null

&& q->right ==

null))elseelse

// 此時r1不可能存在右子樹

r1_father->right = r1->left;

r1->left = r;

r1->right = q->right;

p->left = r1;}}

free(q);

q =null;

return

0; }

return

1;}

對於二叉排序樹,其中序遍歷的輸出結果正好是排好序的序列,其中序

void in_order(node root)

}

對於上述的序列「62,58,88,47,73,99,35,51,93,29,37,49,56,36,48,50」其中序遍歷的結果為:

刪除「47」後的中序遍歷的結果為:

資料結構 二叉排序樹

二叉排序樹是一種特殊結構的二叉樹,它作為一種表的組織手段,通常被稱為 樹表。可以作為一種排序和檢索的手段。定義 二叉排序樹或是空樹,或是具有下述性質的二叉樹 其左子樹上所有結點的資料值均小於根結點的資料值 右子樹上所有結點的資料值均大於或等於根結點的資料值。左子樹和右子樹又各是一棵二叉排序樹。對二叉...

資料結構 二叉排序樹

二叉排序樹 binarysorttree 具有下列性質的二叉樹 1 若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 2 若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值 3 左 右子樹也分別為二叉排序樹 include includeusing namespace std type...

資料結構 二叉排序樹

如果需要乙個滿足 支援排序性 高效插入 刪除操作 高效查詢的資料結構,怎麼做?先看看一些簡單的資料結構 1 排序順序表 陣列 查詢可以採用折半查詢演算法,時間效率為o log2n 插入 刪除操作的時間複雜度為o n 資料量大時,效率太低。2 排序單鏈表 只能採用順序查詢,時間複雜度為o n 不能採用...