C 中一種通用的樹的生成方式

2022-03-30 04:32:04 字數 2658 閱讀 7970

在寫程式時,經常要用到樹的這種結構,如果是做介面程式設計,那麼treeview是乙個不錯的選擇,幾個設定就能把資料繫結好,但是如果自己寫類呢?相對就麻煩一點。

這裡討論一下如何快速建立自己的樹型結構,即怎麼把建樹的方法抽離出來加以復用。

**的復用,不外乎類,介面,泛型。

先考慮用介面來實現,定義乙個itreenode 然後每乙個要建立樹型結構的結點去實現?感覺不大好,因為你要定義比如parent children等一系列的東西,很是很麻煩,每乙個實現起來也很困難。

那抽像類?抽象類的繼承到是方便,但是在實際使用中涉及各種型別轉換,**寫起來不爽。

泛型呢?泛型的結構又過於籠統 ,但是可以折衷一下,就是用泛型定義乙個結點的類

(小弟寫**方式都相對「妥協」,一位大人說的,各位將就著看哈)

1namespace soway.db.tree2 7

public treenodeparent 

8public list> children 

9     }

10 }

結點類定義好了以後,就要去實現乙個 treefactory ,將建樹的通用演算法提出來。

namespace soway.db.tree}}

這裡的我的方法名已經預設為bylevel ,即按層建立樹,這樣,新的問題又出現了:

1.怎麼保證輸入值items是已經按層遍立建立好的結點?

2.怎麼分層?即怎麼區分樹的父結點,子結點,同級結點之間的關係 ?

這些問題其實都與泛型的具體型別有關,但如果把具體型別約束了,那就違反我們本意了。

走一步算一步,先這樣,把樹結點之間的關係定義出來,算是乙個列舉吧:

namespace soway.db.tree

}有了這個關係以後,於是有了進一步的想法,考慮傳遞給treefactory乙個委託,可以通過這個來得到兩個結點之間比較關係:

namespace soway.db.tree

這樣,我們的treefactory裡多了乙個泛型委託的成員。。。

private teenodecomparecompare;

public treefactory(tree.teenodecomparecompare)

現在,當這個泛型委託處理好了以後,我們下一步問題也好辦了,就是將輸入的items進行按層排序,這時,只要有乙個comparison()的實現 ,我直接呼叫 list.sort(comprarion)即可了

下面給出這個comparation的實現 :

private

int compareresult(t ob1, t ob2)

}好,這些基礎工作做完以後,建樹的就容易了:

//////

按層建立樹

//////

建立樹的集合

///建立好的樹結構

public list> createtreebylevel

(listitems )

;//生成要新增的資料 

queue.enqueue(addednode);//

入隊//

看是否到了下一層的結點

if (lastnode != null &&

(compare(addednode.data, lastnode.data) == tree.teenodecompareresult.child

|| compare(addednode.data, lastnode.data) == tree.teenodecompareresult.nexlevelnode)//

)//找到對應的父結點

while (currentnode != null

&&compare(addednode.data, currentnode.data) != teenodecompareresult.child

)if (currentnode !=null && compare(addednode.data, currentnode.data) != teenodecompareresult.equealnode)

current.add(addednode);

lastnode = addednode;}}

return result;

}下面是乙個使用的demo ^_^

//類:

public

string name 

public string url 

public

string view 

public

string action 

public

string text 

public

string image 

public

override

string tostring()}//

比較結點的關係:

static soway.db.tree.teenodecompareresult compare(auth ob1, auth ob2)

///主函式中

var c = new soway.db.dbcontext(builder.tostring());

var items = c.get();//

初始化var tree = new treefactory(new teenodecompare(compare)).createtreebylevel(items);//

建立樹型結構

關於android中一種簡單的分享方式

目前第三方分享方式有兩種 優點 無縫整合,功能多 缺點 整合官方sdk包進行開發,且需要申請官方的授權 優點 及其簡單,不需要sdk和官方授權 這裡我介紹下第二種分享方式,這種分享方式在應用寶和android版百變相機中有應用。典型的 如下 override public void onclick ...

Makefile的一種通用寫法

管理linux環境下的c c 大型專案,如果有乙個智慧型的build system會起到事半功倍的效果,本文描述linux環境下大型工程專案子目錄makefile的一種通用寫法,使用該方法,當該子目錄內的檔案有增刪時無需對makefile進行改動,可以說相當的智慧型。下面先貼 為減小篇幅,一些非關鍵...

一種包含了情感資訊的詞向量生成方法

今天我要講的 主要參考了一篇2011年的acl會議 learning word vectors for sentiment analysis 這篇文章的作者有andrew y.ng,因此整個文章的質量還是 的。我剛看到這篇 的時候,就感到有點奇怪,因為目前業界用的最廣泛的word2vec演算法是20...