二叉排序樹的建立

2022-09-16 03:06:11 字數 3220 閱讀 4063

二叉查詢樹(binary search tree)又叫二叉排序樹(binary sort tree),它是一種資料結構,支援多種動態集合操作,如 search、insert、delete、minimum 和 maximum 等。

二叉查詢樹要麼是一棵空樹,要麼是一棵具有如下性質的非空二叉樹:

若左子樹非空,則左子樹上的所有結點的關鍵字值均小於根結點的關鍵字值。

若右子樹非空,則右子樹上的所有結點的關鍵字值均大於根結點的關鍵字值。

左、右子樹本身也分別是一棵二叉查詢樹(二叉排序樹)。

可以看出,二叉查詢樹是乙個遞迴的資料結構,且對二叉查詢樹進行中序遍歷,可以得到乙個遞增的有序序列。

首先,我們來定義一下 bst 的結點結構體,結點中除了 key 域,還包含域 left, right 和 parent,它們分別指向結點的左兒子、右兒子和父節點:

typedef struct node 

*bstree;

二叉查詢樹作為一種動態結構,其特點是樹的結構通常不是一次生成的,而是在查詢過程中,當樹中不存在結點的關鍵字等於給定值時再進行插入。

由於二叉查詢樹是遞迴定義的,插入結點的過程是:若原二叉查詢樹為空,則直接插入;否則,若關鍵字 k 小於根結點關鍵字,則插入到左子樹中,若關鍵字 k 大於根結點關鍵字,則插入到右子樹中。

/**

* 插入:將關鍵字k插入到二叉查詢樹

*/int bst_insert(bstree &t, int k)

else if(k == t->key)

return 0; // 樹中存在相同關鍵字

else if(k < t->key)

return bst_insert(t->left, k);

else

return bst_insert(t->right, k);

}

構造一棵二叉查詢樹就是依次輸入資料元素,並將它們插入到二叉排序樹中的適當位置。具體過程是:每讀入乙個元素,就建立乙個新結點;若二叉查詢樹為空,則新結點作為根結點;若二叉查詢樹非空,則將新結點的值與根結點的值比較,如果小於根結點的值,則插入到左子樹中,否則插入到右子樹中。

/**

* 構造:用陣列arr建立二叉查詢樹

*/void create_bst(bstree &t, int arr, int n)

node* node = (node*)malloc(sizeof(node));

node->key = k;

node->left = null;

node->right = null;

node->parent = pre;

if(pre == null)

t = node;

else

return 1;

}

對於二叉查詢樹,最常見的操作就是查詢樹中的某個關鍵字。除了search操作外,二叉查詢樹還能支援如 minimum(最小值)、maximum(最大值)、predecessor(前驅)、successor(後繼)等查詢。對於高度為 h 的樹,這些操作都可以在 θ(h) 時間內完成。

1. 查詢

bst 的查詢是從根結點開始,若二叉樹非空,將給定值與根結點的關鍵字比較,若相等,則查詢成功;若不等,則當給定值小於根結點關鍵字時,在根結點的左子樹中查詢,否則在根結點的右子樹中查詢。顯然,這是乙個遞迴的過程。

/**

* 遞迴查詢:返回指向包含關鍵字k的結點的指標

*/node* bst_search(bstree t, int k)

也可以使用非遞迴的實現:

/**

* 非遞迴查詢:返回指向包含關鍵字k的結點的指標

*/node* bst_search_nonrecur(bstree t, int k)

return t;

}

2. 最大值與最小值

由二叉查詢樹的性質可知,最左下結點即為關鍵字最小的結點,最右下結點即為關鍵字最大的結點。此過程無需比較,只需要沿著最左和最右的路徑查詢下去,直到遇到 null 為止。

/**

* 最小值:查詢二叉查詢樹中關鍵字最小的結點

*/node* bst_minimum(bstree t)

/** * 最大值:查詢二叉查詢樹中關鍵字最大的結點

*/node* bst_maximum(bstree t)

3. 前驅與後繼

給定乙個二叉查詢樹的結點,求出它在中序遍歷中的前驅與後繼。如果所有的關鍵字均不相同,則某結點 x 的後繼是:

/**

* 後繼:查詢給定結點在中序遍歷中的後繼結點

*/node* bst_successor(node* node)

return p;

}

求前驅(predecessor)的過程對稱,對於某個結點 x ,它的前驅是:

void bst_delete(bstree &t,node* z)

else

free(z);

} else if(z->left != null && z->right == null)

else

free(z);

} else if(z->left == null && z->right != null)

else

free(z);

} else

}

對於乙個高度為 h 的二叉查詢樹來說,刪除操作和插入操作一樣,都可以在 θ(h) 時間內完成。

二叉查詢樹可以實現任何一種基本的動態集合操作,且各基本操作的執行時間都是 θ(h)。當樹的高度較低時,這些操作執行的較快;但是,當樹的高度較高時,效能會變差。比如,如果各元素是按嚴格增長的順序插入的,那麼構造出來的樹就是乙個高度為 n-1 的鏈。為了儘量減少這種最壞情況的出現,我們可以隨機地構造二叉查詢樹,即隨機地將各關鍵字插入一棵初始為空的樹來構造 bst。

//#include //#include /**

* 隨機構造二叉查詢樹

*/void create_bst(bstree &t, int arr, int n)

}

建立二叉排序樹

建立二叉排序樹 1 建立二叉排序樹,二叉樹排序樹有個特點,如果結點值大於根,則在右子樹去查詢插入位置,如果小於樹根,在左子樹去查詢樹根,如果相等,不作任何操作 2 根據上面的特性,需要兩個結點,分別是當前結點和父節點 3 先遍歷二叉樹節點,找到要插入的位置,根據父節點的指向要插入的位置 實現過程如下...

二叉排序樹的建立

首先二叉排序樹的查詢,這裡father用於記錄訪問點的前序,如果找到關鍵字,也就是程式中的e,則p指向這個結點,而father則指向p的父結點,如果沒有找到關鍵字,則father指向查詢路徑上的最後乙個結點,也可以理解為要插入的結點 關鍵插入father的左子樹或者右子樹 typedef struc...

二叉排序樹的建立

首先二叉樹排序樹 binary sort tree 簡稱bst,又叫二叉查詢樹。具有以下性質 若它的左子樹不為空,則左子樹上的所有結點的值均小於它的根結構的值 若它的右子樹不為空,則右子樹上的所有結點的值均大於它的根結構的值 它的左,右子樹也分別為二叉排序樹。簡單的概括起來就是 左 中 右 由此可知...