二叉查詢樹

2021-07-27 05:43:40 字數 1853 閱讀 7245

先說一下什麼是二叉查詢樹,它是一種特殊的二叉樹,其遞迴定義如下:

- 左子樹任意節點值小於根節點,右子樹任意節點值大於根節點

- 任意節點的左子樹和右子樹也是二叉查詢樹

- 任意節點的值不同

二叉查詢樹的功能主要有三點:

- 插入

- 刪除

- 查詢

但因為使用二叉查詢樹進行上述操作,所用時間和樹的深度成正比,因此若有n個元素,操作的平均時間複雜度為o(logn),是一種極為高效的資料結構。

二叉查詢樹如何實現呢?我們先逐一分析。

假設我們要查詢數字x,我們先讓x和根節點比,如果x小,則x在根節點的左子樹中,反之在根節點的右子樹中,然後繼續按照上述規則與子樹的根節點相比較,直到匹配成功。

插入和查詢類似,也是先和根節點比較,小就放左邊,大就放右邊,直到存在空節點並且滿足構成的樹是二叉查詢樹。

刪除較為複雜,因為一旦把中間某個節點刪除,其子樹便懸空了,那麼我們如何處理這種情況呢?我們首先想到,能不能把子樹的某乙個節點提到該節點處,使之成為新的二叉查詢樹呢?這種想法是可行的,不過要遵從我們的目的:使之成為一棵新的二叉查詢樹。下面直接給出三個處理步驟:

- 如果刪除節點沒有左兒子,則直接把右兒子提上去。

- 如果刪除節點左兒子沒有右兒子,則把左兒子提上去。

- 如果不滿足上兩種情況,則把左兒子子孫中最大的提上去。

那麼如何用**實現呢?

我們使用結構體來表徵每乙個節點(每個節點擁有資料值以及指向左右兒子的指標)。

typedef

struct bstnode;

根據上述分析,插入元素**如下:

node *insertdata(node *ptr,int data)

else

}

查詢**如下:

int finddata(node *ptr,int data)   //返回1表示存在,返回0表示不存在

刪除**如下:

node *deletedata(node *ptr,int data) //在ptr指向節點的子樹及自己中刪除data

else

if(ptr->left->right ==

null)

else

return ptr;

}

現在我們來測試一下,測試**如下:

#include

#include

#include

using namespace std;

typedef struct bstnode;

void print(node *root) //中序遍歷

}node *insertdata(node *ptr,int data)

else

}int finddata(node *ptr,int data) //返回1表示存在,返回0表示不存在

node *deletedata(node *ptr,int data) //在ptr指向節點的子樹及自己中刪除data

else

if(ptr->left->right ==

null)

else

return ptr;

}int main(void)

ouput:

8 3 1 6 4 7 10 14 13

0 1

8 3 1 6 4 7 14 13

二叉樹 二叉查詢樹

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

二叉樹 二叉查詢樹

二叉樹 binary tree 一種樹型結構,每個節點最多擁有兩個節點。如下圖 幾種型別的二叉樹 1.full binary tree 每個節點的孩子數 是 0 或者 2.對高度沒有要求。如下圖 2.perfect binary tree 這個就是最完美的樹,顧名思義,所有葉子節點都有相同的深度,並...

樹(樹,二叉樹,二叉查詢樹)

1.定義 n n 0 個結點構成的有限集合。當n 0時,稱為空樹 2.對於任一棵非空樹 n 0 它具備以下性質 1 樹中有乙個稱為 根 root 的特殊結點,用 r 表示 2 其餘結點可分為m m 0 個互不相交的有限集t1,t2,其中每個集合本身又是一棵樹,稱為原來樹的子樹。3.樹的一些性質 1 ...