求助編輯
百科名片
二叉查詢樹(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 解釋 輸入為 ...