導航:首頁 > 源碼編譯 > 樹演算法

樹演算法

發布時間:2022-02-05 20:45:48

⑴ 二叉樹查找樹演算法實現

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define EQ(a,b) ((a)==(b))
#define LT(a,b) ((a)<(b))
typedef int ElemType;
typedef int Status;
typedef struct TElemType{
int key;
int num;
}TElemType;
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

Status SearchBST(BiTree T,int key,BiTree f,BiTree &p){
if(!T) { p=f; return ERROR;}
else if(EQ(T->data.key,key)) { p=T; return OK; }
else if(LT(key,T->data.key))
return SearchBST(T->lchild,key,T,p);
else return SearchBST(T->rchild,key,T,p);
}
Status SearchBST1(BiTree T,int key,BiTree f,BiTree &p){
if(!T) { p=f; return ERROR;}
else if(EQ(T->data.key,key)) {
printf("%d %d",p->data.key,p->data.num);
p=T; return OK; }
else if(LT(key,T->data.key))
return SearchBST(T->lchild,key,T,p);
else return SearchBST(T->rchild,key,T,p);
}
Status InsertBST(BiTree &T,TElemType e){
BiTree s,p;
if(!SearchBST(T,e.key,NULL,p)){
s=(BiTree)malloc(sizeof(BiTNode));
s->data=e;
s->lchild=s->rchild=NULL;
if(!p) T=s;
else if(LT(e.key,p->data.key)) p->lchild=s;
else p->rchild=s;
return OK;
}
}
Status Output(TElemType e){
printf("%d ",e.key);
printf("%d\n",e.num);
}
Status PreOrderTraver( BiTree T){//二叉樹先序遍歷
if(T==NULL) return ERROR;
else{
Output(T->data);
PreOrderTraver(T->lchild);
PreOrderTraver(T->rchild);}
return OK;
}
int main()
{
BiTree T,f=NULL,q;
TElemType a;
int i,n,b;
printf("請輸入你要創建的二叉排序樹的結點個數:\n");
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",a.key);
scanf("%d",a.num);
InsertBST(T,a);
}
printf("請輸入你要查找的關鍵字: ");{
scanf("%d",b);
if(SearchBST1(T,b,f,q)) printf("查找成功!\n");
else printf("查找失敗!\n");}
printf("二叉樹的先序遍歷:\n");
PreOrderTraver(T);
system("pause");
return 0;
}
這個就是!希望可以幫助你!

⑵ 樹和森林生成二叉樹演算法(請給出數據結構)

這個實現起來蠻簡單的,就是一個根節點的第一個孩子就是他的左孩子,第二個孩子就是他第一個孩子的有孩子,第三個孩子就是他第二個孩子的右孩子。每個節點的第一個孩子是自己的左孩子。等有時間再幫你編這個程序。

⑶ 生成樹演算法

「生成樹」資料

交換機內的生成樹演算法(STA)使你可以創建一條備用鏈路(當網路中存在多台交換機時)。在主鏈路正常工作時,備用鏈路處於空閑狀態(不工作);只有在主鏈路出現問題時,備用鏈路才不需要任何人工干預自動地接替主鏈路。

這種自動重構的功能,使得網路上的用戶能夠最大限度地與網路保持正常的連接。生成樹演算法較復雜,所以,建議最好在充分研究理解其之後,再更改其一些設置。請仔細閱讀並理解下述內容之後,再去更改交換機上的生成樹的默認設置。

網路環路的偵測和預防(Network loop detection and prevention):任何兩個區域網之間應該只有一條路徑,否則,網路中將出現環路。如果存在著多於一條的路徑,那麼生成樹演算法將會偵測到環路的發生,並自動選擇開銷值(c ost)最低的那條路徑作為可使用的路徑(主鏈路),而阻斷其它路徑,將它們作為備用路徑(備用鏈路)。

自動拓撲重構(Automatic topology re-configuration):當主鏈路出現故障時,生成樹演算法將自動啟用備用鏈路,重構網路結構。

生成樹的級別(STA Operation Levels)

生成樹有兩種工作級別:橋級別(bridge level)和埠級別(port level)。在橋一級上,生成樹演算法為每台交換機計算橋的標志級數(Bridge Identifier),然後設定根橋(Root Bridge)和指定橋(Designated Bridges)。而在埠一級上,生成樹演算法設定根埠(Root Port)和指定埠(Designated Ports)。詳述如下:

在橋一級上(On the Bridge Level):

根橋(Root Bridge):具有最小橋標志級數的(lowest Bridge Identifier)交換機是根橋(Root Bridge)。當然,你希望根橋是環路中所有交換機當中最好的一台(交換機),以保證能夠提供最好的網路性能和可靠性。

橋標志級數(Bridge Identifier):橋標志級數是橋的優先順序(Bridge Priority)和交換機的MAC地址的綜合數值,其中橋的優先順序(Bridge Priority)是一個你可以設定的參數。例如,「4 00 80 C8 00 01 00」中的「4」是橋的優先順序,「00 80 C8 00 01 00」是交換機的MAC地址。交換機的橋標志級數越低,則交換機的優先順序越高,這樣可以增加其成為根橋的可能性。

指定橋(Designated Bridge):在每個網段中,到根橋(Root Bridge)的路徑開銷最低的(lowest Root Path Cost)橋將成為指定橋(Designated Bridge),數據包將通過它轉發到網段。一旦所有的交換機具有相同的根路徑開銷(Root Path Cost),那麼具有最低的橋標志級數的(lowest Bridge Identifier)交換機才會被定為指定橋(De signated Bridge)。

根路徑開銷(Root Path Cost):一台交換機的根路徑開銷(Root Path Cost)是根埠(Root Port)的路徑開銷(Path Cost)與數據包經過的所有交換機的根路徑開銷(Root Path Cost)之和。根橋(Root Bridge)的根路徑開銷(Root Path Cost)是零。

橋的優先順序(Bridge Priority):是一個用戶可以設定的參數。設定的值越小,優先順序越高。交換機具有越高的優先順序,才越有可能成為根橋。

在埠一級上(On the Port Level):

根埠(Root Port):每台交換機都有一個根埠(Root Port),這個埠到根橋的路徑開銷最低。一旦多個埠具有相同的到根橋的路徑開銷時,那麼具有最低的埠標志級別的才會成為根埠。

指定埠(Designated Port):指定埠就是指定橋(Designated Bridge)上的埠。

埠優先順序(Port Priority):數值越小,埠的優先順序就越高。具有越高埠優先順序,才越有可能成為根埠。

路徑開銷(Path Cost):這是一個可變的參數,它將隨著生成樹中的設定值的變化而變化。依據STA的默認參數值,每個1000Mbps網段有一個指定的路徑開銷值為4 ,100Mbps網段的路徑開銷值19,10Mbps網段的路徑開銷值100.

生成樹參數(STA Parameters)

生成樹的參數用戶可以根據自己的需要進行修改,但是建議最好使用出廠時的默認設置。除非確實需要對出廠設置值進行變動時,再去改動默認值。用戶可以改動的生成樹參數有如下幾個:

橋優先順序(Bridge Priority):數值范圍從0到65535.「0」的優先順序最高。

呼叫時間(Bridge Hello Time):數值范圍從1秒到10秒。是指根橋向其它所有交換機發出BPDU數據包的時間間隔,以告知其它所有交換機它是根橋。如果你的交換機還未是根橋時為其設置了呼叫時間,那麼,一旦你的交換機成為根橋,該呼叫時間就會派上用處。

注意:呼叫時間不能大於橋的最大老化時間(Max. Age),否則,將出現錯誤信息。

最大的橋老化時間(Bridge Max. Age):數值范圍從6秒到40秒。如果在超出最大老化時間之後,還沒有收到根橋發出的BPDU數據包,那麼,在允許的條件下你的交換機將充當根橋向其它所有的交換機發出B PDU數據包。如果交換機確實具有最小的橋標志級數,那麼,它將隨之成為根橋。

橋轉發時延(Bridge Forward Delay):數值范圍從4秒到30秒。是指交換機的埠從阻塞狀態轉為轉發狀態所用的監聽時間。

當你欲變動生成樹參數時,請一定記住下述公式:

最大的橋老化時間≤ 2 x(橋轉發時延 – 1秒)

即:Max. Age ≤ 2 x (Forward Delay - 1 second)

最大的橋老化時間≥ 2 x(呼叫時間 + 1秒)

即:Max. Age ≥ 2 x (Hello Time + 1 second)

埠優先順序(Port Priority):數值范圍從0到255.數值越小,那麼該埠越可能成為根埠。

⑷ 二叉樹演算法如何學習

理解是關鍵,多看書,有條件上機,對理解有幫助,慢慢就會了!!!
加油啊!!!

⑸ 簡單介紹樹回歸的演算法原理

簡單介紹樹回歸的演算法原理
線性回歸方法可以有效的擬合所有樣本點(局部加權線性回歸除外)。當數據擁有眾多特徵並且特徵之間關系十分復雜時,構建全局模型的想法一個是困難一個是笨拙。此外,實際中很多問題為非線性的,例如常見到的分段函數,不可能用全局線性模型來進行擬合。
樹回歸將數據集切分成多份易建模的數據,然後利用線性回歸進行建模和擬合。
構建回歸樹演算法偽代碼:
尋找當前最佳待切特徵和特徵值並返回
如果當前最佳特徵沒有找到,不可切分,則把當前結點的數據均值作為葉節點
否則用最佳特徵和特徵值構建當前結點
切分後的左右節點分別遞歸以上演算法
尋找最佳特徵演算法偽代碼:
如果該數據集的特徵值只有一種,不可切分,返回當前結點的數據均值作為特徵值
否則重復一下步驟直到找到最小總方差
遍歷每一列
遍歷每列的值
用該值切分數據
計算總方差
如果總方差差值小於最初設定的閾值,不可切分
如果左右樣本數小於最初設定的閾值,不可切分
否則返回最佳特徵和最佳特徵值。
需要輸入的參數有:數據集,葉節點模型函數(均值),誤差估計函數(總方差),允許的總方差最小下降值,節點最小樣本數。

⑹ 最優二叉樹演算法的介紹

衡量一個演算法的優劣有許多因素,效率就是其中之一。而效率指的就是演算法的執行時間。提高效率是軟體開發必須注重的問題。對同一個問題往往有多個演算法可以解決,在同等條件下,執行時間短的演算法其效率是最高的。從霍夫曼樹的定義以及霍夫曼演算法出發,介紹如何構造霍夫曼樹以及利用霍夫曼演算法優化程序設計的原理,重點討論在判定類問題中利用霍夫曼樹可以建立最佳判定演算法,提高程序的執行速度。

⑺ 交換二叉樹的所有節點的左右子樹演算法(C語言)

#include<stdio.h>
#include<malloc.h>
typedef struct binode{
int data;
struct binode *lchild,*rchild;
}binode,*bitree;
typedef struct{
bitree elem[100];
int top;
}stack;
bitree creat_bt(){ //按擴展前序建二叉樹
bitree t;int x;
scanf("%d",&x);
if (x==0) t=NULL;
else { t=(bitree)malloc(sizeof(binode));
t->data=x;
t->lchild=creat_bt();
t->rchild=creat_bt();
}
return t;
}
void exchange(bitree t) //左、右子樹交換
{bitree p;
if(t!=NULL)
{ p=t->lchild;t->lchild=t->rchild;
t->rchild=p;
exchange(t->lchild);
exchange(t->rchild);
}
}
void inorder(bitree bt) //遞歸的中序遍歷
{ if (bt){
inorder(bt->lchild);
printf("% d",bt->data);
inorder(bt->rchild);
}
}
main()
{bitree root;
printf("\n");
printf("建二叉樹,輸入元素:");
root=creat_bt(); /*create tree of useing preorder*/
printf("交換前的中序序列是:");
inorder(root);
exchange(root);
printf("\n交換後的中序序列是:");
inorder(root);
printf("\n");
}

⑻ 數據結構與演算法 二叉樹交換左右子樹演算法

原來節點結構體:
typedef struct
{
Element X;
Node* pLeft;
Node* pRight;
}Node;

現在從新定義一個結構
typedef struct
{
Element X;
NewNode* pRight;
NewNode* pLeft;
}NewNode;

然後用新樹的根指向原樹的根
Node* pOldTree; 老樹
NewNode* pNewTree = (NewNode*)pOldTree;

這樣省的交換了,省事吧 -_,-

⑼ 二叉樹 演算法

原因就在於Status CreatBitTree(BitTree e) 這個函數的參數BitTree e,既然e是參數,因此你在函數體內用e=NULL; 及e=(BitTree)malloc(sizeof(BitNode)); 來給e賦值都是沒有用的,賦值不會返回給調用處。修改的話改成引用就可以了。也就是把Status CreatBitTree(BitTree e) 這一行改成Status CreatBitTree(BitTree &e) 就行了。

還有:二叉樹演算法遞歸中序輸入是abc##de#g##f### (你這應該是前序輸入吧?)

⑽ 二叉樹演算法是什麼

二叉樹是每個節點最多有兩個子樹的有序樹。通常子樹被稱作「左子樹」(left subtree)和「右子樹」(right subtree)。二叉樹常被用於實現二叉查找樹和二叉堆。



性質

1、在二叉樹中,第i層的結點總數不超過2^(i-1)。

2、深度為h的二叉樹最多有2^h-1個結點(h>=1),最少有h個結點。

3、對於任意一棵二叉樹,如果其葉結點數為N0,而度數為2的結點總數為N2,則N0=N2+1。


閱讀全文

與樹演算法相關的資料

熱點內容
無法接伺服器是什麼情況 瀏覽:210
壓縮褲的尺寸如何選擇 瀏覽:469
伺服器命令如何下載文件夾下 瀏覽:548
交叉編譯工具的安裝位置 瀏覽:587
linux命令ping本地地址 瀏覽:214
方舟編譯器和超級文件管理 瀏覽:118
81年的程序員 瀏覽:32
技能人才佔比演算法 瀏覽:55
s8文件夾忘記密碼怎麼辦 瀏覽:918
大家的日語中級pdf 瀏覽:438
編譯與運行什麼區別 瀏覽:841
死或生5PS3解壓 瀏覽:244
pdf怎麼刪字 瀏覽:54
買壓縮面膜注意什麼 瀏覽:111
新加坡玩什麼伺服器好 瀏覽:140
加密金融科技發展 瀏覽:565
易學java編譯器 瀏覽:59
克隆usb加密狗 瀏覽:882
動態代理編譯器 瀏覽:65
單片機io口電流放大 瀏覽:656