若根結(jié)點的關(guān)鍵字值等于查找的關(guān)鍵字,成功。
否則,若小于根結(jié)點的關(guān)鍵字值,遞歸查左子樹。
若大于根結(jié)點的關(guān)鍵字值,遞歸查右子樹。
若子樹為空,查找不成功。
插入算法:
首先執(zhí)行查找算法,找出被插結(jié)點的父親結(jié)點。
判斷被插結(jié)點是其父親結(jié)點的左、右兒子。將被插結(jié)點作為葉子結(jié)點插入。
若二叉樹為空。則首先單獨生成根結(jié)點。
注意:新插入的結(jié)點總是葉子結(jié)點。
void InsertBST(t,key)
//在二叉排序樹中插入查找關(guān)鍵字key
{
if(t==NULL){
t=new BiTree;
t->lchild=t->rchild=NULL;
t->data=key;
return; }
if(keydata ) InsertBST(t->lchild,key);
else InsertBST (t->rchild, key );
}
void CreateBiTree(tree,d【 】,n)
//n個數(shù)據(jù)在數(shù)組d中,tree為二叉排序樹根
{tree=NULL;
for(i=0;i InsertBST(tree,d);
}
你好,新房墻面一般不用鏟,但前提是手摸墻面時不掉白(墻灰),再用美巢牌“墻錮”(界面劑)輥涂一遍,舊房就需要鏟掉了,因為年頭太長墻體表面會粉化,(輥界面劑也不行),這樣跟新刮的膩子不能粘接。注意,鏟掉...
計算應(yīng)該先結(jié)構(gòu),后裝修,先地下,后地上,計算設(shè)計圖紙的工程量。
一、設(shè)置繪圖單位選擇[格式]——[單位] :精度由0.000改為0;單位:毫米。二、設(shè)置繪圖界限(既選擇打印紙大?。┻x擇[格式]——[繪圖界限] :如 設(shè)A3:左下角為:0,0 右上角為:420,29...
格式:pdf
大?。?span id="ay7eyox" class="single-tag-height">62KB
頁數(shù): 11頁
評分: 4.7
家庭裝修基本步驟 -二十步 家庭裝修步驟 (一)前期設(shè)計 1、明確裝修過程涉及的面積。特別是貼磚面積、墻面漆面積、壁紙面積、地板面積; 2、明確主要墻面尺寸。特別是以后需要設(shè)計擺放家具的墻面尺寸。 家庭裝修步驟 (二)主體拆改 主要包括拆墻、砌墻、鏟墻皮、拆暖氣、換塑鋼窗等等。主體拆改說白了,就是先把工地的框架先搭起 來。 家庭裝修步驟 (三)水電改造 1、看看油煙機插座的位置是否影響以后油煙機的安裝; 2、看看水表的位置是否合適; 3、看看上水口的位置是否便于以后安裝水槽。 家庭裝修步驟 (四)木工 木工、瓦工、油工是施工環(huán)節(jié)的“三兄弟”,基本出場順序是:木——瓦——油?;境鰣鲈瓌t是— —誰臟誰先上?!罢l臟誰先上”也是決定家裝順序的一個基本原則之一。 家庭裝修步驟 (五)貼磚 1、過門石、大理石窗臺的安裝。過門石的安裝可以和鋪地磚一起完成,也可以在鋪地磚之后,大理石 窗臺的安裝一般在窗
格式:pdf
大?。?span id="c84qzcm" class="single-tag-height">62KB
頁數(shù): 3頁
評分: 4.8
一、地產(chǎn)規(guī)劃前期步奏 [準備階段 ] 1、 項目資源條件整合及判斷 負責(zé)部門: 策劃部、項目部、會員銷售部、工程部 報告名稱: 《 ** 項目策劃大綱》 中心內(nèi)容: 資源條件整合 宏觀資料:市場整體、片區(qū)趨勢、基本行情。 地段資料:規(guī)劃要點、坐標。 周邊資料:交通、配套、(種植、康復(fù)養(yǎng)老)的規(guī)劃、設(shè)計、包裝、銷售。 發(fā)展商資料:背景、關(guān)系、資金、技術(shù)等的實力情況。 判斷內(nèi)容:優(yōu)勢、難點、突破口、把握度。 2、 多方案初步規(guī)劃、設(shè)計或調(diào)整建議 負責(zé)部門: 策劃部、項目部、工程部、設(shè)計院 報告名稱: 《會議紀要匯總》 《項目概念設(shè)計提示》或《項目調(diào)整建議》 中心內(nèi)容: 草圖、立意、說明、交流記錄 [前期策劃階段 ] 3、 地塊內(nèi)在條件整合及價值分析 負責(zé)部門: 策劃部、項目部、財務(wù)部 報告名稱: 《項目土地價值與分析報告》 中心內(nèi)容: 適合的規(guī)則布局和建筑類型及其投入和產(chǎn)出價值比較 4、
1.二叉排序樹的概念:
二叉排序樹是一種動態(tài)樹表。
二叉排序樹的定義:二叉排序樹或者是一棵空樹,
或者是一棵具有如下性質(zhì)的二叉樹:
⑴ 若它的左子樹非空,則左子樹上所有結(jié)點的值均小于根結(jié)點的值;
⑵ 若它的右子樹非空,則右子樹上所有結(jié)點的值均大于根結(jié)點的值;
⑶ 左、右子樹本身又各是一棵二叉排序樹。二叉排序樹的性質(zhì): 按中序遍歷二叉排序樹,所得到的中序遍歷序列是一個遞增有序序列。
2.二叉排序樹的插入:
在二叉排序樹中插入新結(jié)點,要保證插入后的二叉樹仍符合二叉排序樹的定義。
插入過程:若二叉排序樹為空,則待插入結(jié)點*S作為根結(jié)點插入到空樹中;
當非空時,將待插結(jié)點關(guān)鍵字S->key和樹根關(guān)鍵字t->key進行比較,
若s->key = t->key,則無須插入,若s->key< t->key,則插入到根的左子樹中,
若s->key> t->key,則插入到根的右子樹中。而子樹中的插入過程和在樹中的插入過程相同,
如此進行下去,直到把結(jié)點*s作為一個新的樹葉插入到二叉排序樹中,或者直到發(fā)現(xiàn)樹已有相同關(guān)鍵字的結(jié)點為止。
3. 二叉排序樹生成:
從空的二叉排序樹開始,經(jīng)過一系列的查找插入操作以后,生成了一棵二叉排序樹。
說明:
① 每次插入的新結(jié)點都是二叉排序樹上新的葉子結(jié)點。
② 由不同順序的關(guān)鍵字序列,會得到不同二叉排序樹。
③ 對于一個任意的關(guān)鍵字序列構(gòu)造一棵二叉排序樹,其實質(zhì)上對關(guān)鍵字進行排序。
4.二叉排序樹查找的程序?qū)崿F(xiàn):
5. 二叉排序樹的刪除:
假設(shè)被刪結(jié)點是*p,其雙親是*f,不失一般性,設(shè)*p是*f的左孩子,下面分三種情況討論:
⑴ 若結(jié)點*p是葉子結(jié)點,則只需修改其雙親結(jié)點*f的指針即可。
⑵ 若結(jié)點*p只有左子樹PL或者只有右子樹PR,則只要使PL或PR 成為其雙親結(jié)點的左子樹即可。
⑶ 若結(jié)點*p的左、右子樹均非空,先找到*p的中序前趨結(jié)點*s(注意*s是*p的左子樹中的最右下的結(jié)點,它的右鏈域為空),然后有兩種做法:
① 令*p的左子樹直接鏈到*p的雙親結(jié)點*f的左鏈上,而*p的右子樹鏈到*p的中序前趨結(jié)點*s的右鏈上。
② 以*p的中序前趨結(jié)點*s代替*p(即把*s的數(shù)據(jù)復(fù)制到*p中),將*s的左子樹鏈到*s的雙親結(jié)點*q的左(或右)鏈上。
6. 刪除算法演示 :
7. 二叉排序樹的查找:
在二叉排序樹中進行查找的過程和二分查找類似,也是一個逐步縮小查找范圍的過程。若查找成功,則是走了一條從根結(jié)點到待查結(jié)點的路徑;若查找失敗,則是走了一條根結(jié)點到某個葉子結(jié)點的路徑。因此,查找過程中和關(guān)鍵字比較的次數(shù)不超過樹的深度。
由于含有n個結(jié)點的二叉排序樹不唯一,形態(tài)和深度可能不同。故含有n個結(jié)點的二叉排序樹的平均查找長度和樹的形態(tài)有關(guān)。
最好的情況是: 二叉排序樹和二叉判定樹形態(tài)相同。
最壞的情況是: 二叉排序樹為單支樹,這時的平均查找長度和順序查找時相同。
最壞情況示例
就平均性能而言,
二叉排序樹上的查找和二分查找相差不大,并且二叉排序樹上的插入和刪除結(jié)點十分方便,無須大量移動結(jié)點。
二叉排序樹查找
二叉排序樹(Binary Sort Tree:BST)
1、二叉排序樹的定義
二叉排序樹(Binary Sort Tree)又稱二叉查找(搜索)樹(Binary Search Tree)。其定義為:二叉排序樹或者是空樹,或者是滿足如下性質(zhì)的二叉樹:
①若它的左子樹非空,則左子樹上所有結(jié)點的值均小于根結(jié)點的值;
②若它的右子樹非空,則右子樹上所有結(jié)點的值均大于根結(jié)點的值;
③左、右子樹本身又各是一棵二叉排序樹。
上述性質(zhì)簡稱二叉排序樹性質(zhì)(BST性質(zhì)),故二叉排序樹實際上是滿足BST性質(zhì)的二叉樹。
2、二叉排序樹的特點
由BST性質(zhì)可得:
(1) 二叉排序樹中任一結(jié)點x,其左(右)子樹中任一結(jié)點y(若存在)的關(guān)鍵字必小(大)于x的關(guān)鍵字。
(2) 二叉排序樹中,各結(jié)點關(guān)鍵字是惟一的。
注意:
實際應(yīng)用中,不能保證被查找的數(shù)據(jù)集中各元素的關(guān)鍵字互不相同,所以可將二叉排序樹定義中BST性質(zhì)(1)里的"小于"改為"小于等于",或?qū)ST性質(zhì)(2)里的"大于"改為"大于等于",甚至可同時修改這兩個性質(zhì)。
(3) 按中序遍歷該樹所得到的中序序列是一個遞增有序序列。
【例】下圖所示的兩棵樹均是二叉排序樹,它們的中序序列均為有序序列:2,3,4,5,7,8。
3、二叉排序樹的存儲結(jié)構(gòu)
typedef int KeyType; //假定關(guān)鍵字類型為整數(shù)
typedef struct node { //結(jié)點類型
KeyType key; //關(guān)鍵字項
InfoType otherinfo; //其它數(shù)據(jù)域,InfoType視應(yīng)用情況而定,下面不處理它
struct node *lchild,*rchild,*parent; //左右孩子指針
} BSTNode;
typedef BSTNode *BSTree; //BSTree是二叉排序樹的類型
二叉排序樹的基本操作(pascal):
1.中序遍歷所有元素
procedure tree_walk(x:longint);
begin
if x<>0 then
begin
tree_walk(left[x]);
write(key[x]);
tree_walk(right[x]);
end;
2.查找給定的元素
function tree_search(x,k:longint):longint;
begin
if (x=0) or (k=key[x]) then exit(x);
if k end; 非遞歸版本 function tree_search(x,k:longint):longint; begin while (x<>0) and (k<>key[x]) do begin if k end; exit(x); end; 3.查找最小元素 function tree_minimum(x:longint):longint; begin while left[x]<>0 do x:=left[x]; exit(x); end; 查找最大元素 function tree_maximum(x:longint):longint; begin while right[x]<>0 do x:=right[x]; exit(x); end; 4. 求后繼 function tree_successor(x:longint):longint; var y:longint; begin if right[x]<>0 then exit(tree_minimum(right[x]));//若右子樹不空,則返回右子樹中的最小值 y:=p[x];//若右子樹為空,則后繼y為x的最低祖先節(jié)點,且y的左兒子也是x的祖先 while (y<>0) and (x=right[y]) do begin x:=y; y:=p[y]; end; exit(y);//注意,若y為0,則x無后繼 end; //注意,函數(shù)返回值為節(jié)點編號,并不是節(jié)點本身的值 5.插入 procedure tree_insert(z:longint);//注意z為節(jié)點編號,并非樹中的值 var x,y:longint; begin y:=0; x:=root; while x<>0 do//查找z的父節(jié)點,y記錄 begin y:=x; if key[z] end; p[x]:=y; if y=0 then root:=z//若z為根節(jié)點 else begin if key[z] end; end; 6.刪除 刪除操作是最麻煩的,分3種情況: (1)若z無子樹,則就刪除z節(jié)點,更新p[z]的值為空 (2)若z有一個子樹,刪除z節(jié)點,更新p[z]的值為z的兒子節(jié)點,更新left[p[z]] 或 right[p[z]] (3)若z有兩棵子樹,先找到z的后繼y(后繼節(jié)點無左子樹,可證),刪除y節(jié)點,更新p[y]與left[p[y]] 或 right[p[y]],最后用節(jié)點y的數(shù)據(jù)覆蓋z節(jié)點 procedure tree_delete(z:longint); var x,y:longint; begin if (left[z]=0) or (right[z]=0) then y:=z else y:=tree_successor(z); if left[y]<>0 then x:=left[y] else x:=right[y]; if x<>0 then p[x]:=p[y]; if p[y]=0 then root:=x else begin if y=left[p[y]] then left[p[y]]:=x else right[p[y]]:=x; end; if z<>y then key[z]:=key[y]; end; 7.查找數(shù)中第k大元素 需要對每個節(jié)點新開一個域v[x],記錄該節(jié)點的有多少子節(jié)點, 查找時分三種情況: (1)k=v[left[x]] 1 則當前x節(jié)點為所求 (2)k<=v[left[x]] 則在左子樹中繼續(xù)查找 (3)k>v[left[x]] 1 則在右子樹中繼續(xù)查找,k更新為k-left[x]-1; function find(x,k:longint):longint; begin if v[left[x]] 1=k then exit(key[k]) else if v[left[x]]>=k then exit(find(left[x],k)) else exit(find(right[x],k-v[left[x]]-1)); end;