二叉搜尋樹

2021-06-07 20:02:31 字數 3214 閱讀 2197

求助編輯

百科名片

二叉查詢樹(binary search tree),或者是一棵空樹,或者是具有下列性質的二叉樹: 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值; 它的左、右子樹也分別為二叉排序樹。

目錄查詢過程

目錄 二叉排序樹的查詢演算法

在二叉排序樹插入結點的演算法

情況討論

二叉排序樹的查詢過程和次優二叉樹類似,通常採取二叉鍊錶作為二叉排序樹的儲存結構。中序遍歷二叉排序樹可得到乙個關鍵字的有序序列,乙個無序序列可以通過構造一棵二叉排序樹變成乙個有序序列,構造樹的過程即為對無序序列進行排序的過程。每次插入的新的結點都是二叉排序樹上新的

葉子結點

,在進行插入操作時,不必移動其它結點,只需改動某個結點的指標,由空變為非空即可。搜尋,插入,刪除的複雜度等於樹高,o(log(n)).

1 二叉排序樹的查詢演算法

2 在二叉排序樹插入結點的演算法

3 在二叉排序樹刪除結點的演算法

4 二叉排序樹效能分析

在二叉排序樹b中查詢x的過程為:

若b是空樹,則搜尋失敗,否則:

若x等於b的根結點的資料域之值,則查詢成功;否則:

若x小於b的根結點的資料域之值,則搜尋左子樹;否則:

查詢右子樹。

status searchbst(bitree t, keytype key, bitree f, bitree &p) //查詢不成功

else if eq(key, t->data.key) //查詢成功

else if lt(key,t->data.key)

return searchbst(t->lchild, key, t, p); //在左子樹中繼續查詢

else return searchbst(t->rchild, key, t, p); //在右子樹中繼續查詢

pascal語言實現

type

link = ^tree;

tree = record

d :longint;

left :link;

right :link;

end;

function search(n :longint;t :link):boolean;

begin

if t^.d < n then begin

if t^.right = nil then exit(false) else exit(search(n,t^.right));

end;

if t^.d > n then begin

if t^.left = nil then exit(false) else exit(search(n,t^.left));

end;

exeit(true);

end;

向乙個二叉排序樹b中插入乙個結點s的演算法,過程為:

若b是空樹,則將s所指結點作為根結點插入,否則:

若s->data等於b的根結點的資料域之值,則返回,否則:

若s->data小於b的根結點的資料域之值,則把s所指結點插入到左子樹中,否則:

把s所指結點插入到右子樹中。

/*當二叉排序樹t中不存在關鍵字等於e.key的資料元素時,插入e並返回true,否則返回false*/

status insertbst(bitree &t, elemtype e)

else

return false;

//樹中已有關鍵字相同的結點,不再插入

} pascal**:

procedure push(n :longint;var t:link);

var p,q :link;

begin

if t^.d < n then begin

if t^.right = nil then begin

new(p);

p^.d := n;

p^.right := nil;

p^.left := nil;

t^.right := p;

end else push(n,t^.right);

end else begin

if t^.left = nil then begin

new(p);

p^.d := n;

p^.right := nil;

p^.left := nil;

t^.left := p;

end else push(n,t^.left);

end;

end;

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

若*p結點為葉子結點,即pl(左子樹)和pr(右子樹)均為空樹。由於刪去葉子結點不破壞整棵樹的結構,則只需修改其雙親結點的指標即可。

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

若*p結點的左子樹和右子樹均不空。在刪去*p之後,為保持其它元素之間的相對位置不變,可按中序遍歷保持有序進行調整,可以有兩種做法:其一是令*p的左子樹為*f的左子樹,*s為*f左子樹的最右下的結點,而*p的右子樹為*s的右子樹;其二是令*p的直接前驅(或直接後繼)替代*p,然後再從二叉排序樹中刪去它的直接前驅(或直接後繼)。在二叉排序樹上刪除乙個結點的演算法如下:

status deletebst(bitree &t, keytype key); 找到關鍵字等於key的資料元素

else if(lt(key, t->data.key)) return deletebst(t->lchild, key);

else return deletebst(t->rchild, key);

} }

status delete(bitree &p)

else if(!p->lchild)

else //轉左,然後向右到盡頭

p->data = s->data; //s指向被刪結點的「前驅」

if(q!=p)

q->rchild = s->lchild; //重接*q的右子樹

else

q->lchild = s->lchild; //重接*q的左子樹

free(s);

} return true;

}

二叉搜尋樹 二叉搜尋樹

題目 二叉搜尋樹 time limit 2000 1000 ms j a others memory limit 32768 32768 k j a others total submission s 6945 accepted submission s 3077 problem descripti...

二叉搜尋樹 修剪二叉搜尋樹

第一反應是重構,看來別人的解答發現,其實不用重構那麼複雜。treenode trimbst treenode root,int low,int high if root val high 下一層處理完左子樹的結果賦給root left,處理完右子樹的結果賦給root right。root left ...

樹 二叉樹 二叉搜尋樹

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 13輸出 true 示例 2 輸入 5 14 3 6輸出 false 解釋 輸入為 ...