日本福利一区_最近中文高清在线观看_免费黄色电影在线观看_亚洲天堂成人在线 - 91人人

用戶中心
· 企業(yè)空間 首頁 | 資訊 | 技術(shù) | 產(chǎn)品 | 企業(yè) | 直播 | 專題 | 智能制造 | 論壇| 在線研討會(huì)
紫金橋軟件技術(shù)有限公司
企業(yè)空間 > 案例應(yīng)用 > 正文
  • 函數(shù)遞歸在樹形結(jié)構(gòu)數(shù)據(jù)遍歷中的應(yīng)用
  • 發(fā)布時(shí)間:2012/11/5 10:22:38   修改時(shí)間:2012/11/5 10:22:38 瀏覽次數(shù):2161
  •  

           我們?cè)谑褂脴湫谓Y(jié)構(gòu)數(shù)據(jù)時(shí),常常需要遍歷整棵樹或某一支下的所有結(jié)點(diǎn),用于查找、打印等功能。因?yàn)闃湫谓Y(jié)構(gòu)不同于數(shù)組、鏈表等簡(jiǎn)單數(shù)據(jù)結(jié)構(gòu),它像樹枝一樣每個(gè)根結(jié)點(diǎn)可以具有多個(gè)子結(jié)點(diǎn),無限延展,因此需要專門的算法去遍歷。樹形結(jié)構(gòu)的遍歷有很多種方法,下面我們以紫金橋監(jiān)控組態(tài)軟件(以下簡(jiǎn)稱為“RealInfo)為例,簡(jiǎn)單講解函數(shù)遞歸在這種遍歷方法中的應(yīng)用。

           RealInfo中,“樹形控件”是表示樹狀結(jié)構(gòu)數(shù)據(jù)的組件,“自由報(bào)表”是表示表格數(shù)據(jù)的組件,這兩種組件自身都提供了一些常用方法。我們現(xiàn)在實(shí)現(xiàn)這樣的功能:將樹形控件中的指定分支數(shù)據(jù)打印在自由報(bào)表中。可以利用窗口自定義函數(shù)的遞歸功能。

           樹形控件中的數(shù)據(jù)顯示方式如下圖所示:

     

     

           每個(gè)結(jié)點(diǎn)以結(jié)點(diǎn)編碼為唯一標(biāo)識(shí),每個(gè)結(jié)點(diǎn)可以顯示一個(gè)字符串作為結(jié)點(diǎn)文本(詳見RealInfo聯(lián)機(jī)幫助)。

           本例中,我們將樹形結(jié)構(gòu)數(shù)據(jù)打印在自由報(bào)表上,其效果如下圖所示:

     

     

           每個(gè)根結(jié)點(diǎn)打印完成后,遇到子結(jié)點(diǎn)時(shí)打印位置自動(dòng)向右、向下移動(dòng)一個(gè)單元格;遇到兄弟結(jié)點(diǎn)時(shí)打印位置向下移動(dòng)一個(gè)單元格。

           現(xiàn)在我們開始分析算法。我們知道,樹的遍歷是指沿著某條搜索路線,依次對(duì)樹中每個(gè)結(jié)點(diǎn)均做一次且僅做一次訪問。這樣,我們把遍歷過程想象成為一次單程旅行,出發(fā)點(diǎn)是樹的根結(jié)點(diǎn),然后按先自左向右、然后自上而下的順序,先后經(jīng)過每個(gè)結(jié)點(diǎn),最后走到最下方的葉子結(jié)點(diǎn)處。

    我們可以采用這樣的遍歷方式:

    1)        當(dāng)所在結(jié)點(diǎn)具有子結(jié)點(diǎn)時(shí),那么按自左向右原則,接著訪問它的第一個(gè)子結(jié)點(diǎn),直到所在結(jié)點(diǎn)沒有子結(jié)點(diǎn)為止。

    2)        當(dāng)所在結(jié)點(diǎn)沒有子結(jié)點(diǎn),但具有兄弟結(jié)點(diǎn)時(shí),那么按自上向下原則依次訪問它的兄弟結(jié)點(diǎn)。

    3)        當(dāng)所在結(jié)點(diǎn)沒有子結(jié)點(diǎn),而且沒有兄弟結(jié)點(diǎn)時(shí),那么按自上向下原則訪問它父結(jié)點(diǎn)的兄弟結(jié)點(diǎn)。

    分析這個(gè)過程并觀察樹形結(jié)構(gòu),我們會(huì)發(fā)現(xiàn),每個(gè)父結(jié)點(diǎn)可以擁有n(n>=0)個(gè)子結(jié)點(diǎn),若將這n個(gè)子結(jié)點(diǎn)看作父結(jié)點(diǎn),則每個(gè)父結(jié)點(diǎn)仍然具有n個(gè)子結(jié)點(diǎn)。由此看來,每一支數(shù)據(jù)乃至整棵樹都可以看作是有限個(gè)父-子結(jié)構(gòu)的組合。在樹的遍歷過程中,總是不斷的重復(fù)“父→子”這一訪問方式,因此我們可以提取這一方式形成一個(gè)函數(shù),并利用函數(shù)遞歸來完成整個(gè)遍歷。

    這個(gè)函數(shù)用于根據(jù)輸入的父結(jié)點(diǎn)編碼和起始打印位置將其所有子結(jié)點(diǎn)打印出來。算法如下:

     

     

     

     

     

     

     

     

     

     

     

     

     

           函數(shù)首先判斷輸入結(jié)點(diǎn)是否具有子結(jié)點(diǎn),如果沒有則返回,如果有則取得子結(jié)點(diǎn)列表,然后循環(huán)打印每個(gè)子結(jié)點(diǎn)并遞歸調(diào)用自身函數(shù)打印其子結(jié)點(diǎn),當(dāng)一個(gè)結(jié)點(diǎn)a的子結(jié)點(diǎn)打印完畢并返回后按相同規(guī)則依次打印的a結(jié)點(diǎn)的兄弟結(jié)點(diǎn),直到所有兄弟結(jié)點(diǎn)打印完畢為止。

           工程制作過程如下:

    1)        新建窗口,創(chuàng)建樹形控件,起名為“tree”;創(chuàng)建自由報(bào)表起名為“report”;創(chuàng)建一個(gè)按鈕。

    2)        創(chuàng)建窗口函數(shù)(用于得到指定結(jié)點(diǎn)的子結(jié)點(diǎn)編碼數(shù)組):

    func_GetAllChildNodeKey(Tree& treeObj, String& strFatherNodeKey, String Array& strArrChildNodeKeys) As Int

     

     

    代碼如下:

    int nChildNodeCount = 0;

    string strNodeKeyTemp = "";

    int i = 0;

     

    strArrChildNodeKeys.Clear();

    nChildNodeCount = #treeObj.GetNodeCount(strFatherNodeKey);

    for i="0" to nChildNodeCount

           if strFatherNodeKey=="" then

                  strNodeKeyTemp = IntToStr(i,10);

           else

                  strNodeKeyTemp = strFatherNodeKey + "." + IntToStr(i,10);

           endif

           strArrChildNodeKeys.Add(strNodeKeyTemp);

    next

     

    return nChildNodeCount;

    3)        創(chuàng)建窗口函數(shù)(用于遞歸打印指定結(jié)點(diǎn)的子結(jié)點(diǎn),不打印自身結(jié)點(diǎn))

    func_PrintToReport(String strFatherNodeKey, Int nCol, Int nRow, Int& nRowOffSet) As Int

     

     

    代碼如下:

    string strArrChildNodeKeys[];

    string strNodeText = "";

    int nCount = 0;

    int i = 0;

     

    func_GetAllChildNodeKey(#tree,strFatherNodeKey,strArrChildNodeKeys);

    nCount = strArrChildNodeKeys.GetCount();

    if nCount>0 then

           if #report.ColCount()<nCol then

                  #report.AddCol(1);

           endif

           for i="0" to nCount

                  if #report.RowCount()<nRow+nRowOffset then

                         #report.AddRow(1);

                  endif

                 

                  strNodeText = #tree.GetNodeTxt(strArrChildNodeKeys[i]);       //打印本結(jié)點(diǎn)

                  #report.SetTxt(nCol,nRow+nRowOffset,strNodeText);

                  nRowOffset = nRowOffset + 1;

                  nRowOffset = func_PrintToReport(strArrChildNodeKeys[i]

    ,nCol+1,nRow,nRowOffset); //遞歸

           next

    endif

    return nRowOffset;

    4)        創(chuàng)建窗口函數(shù)(用于打印初始結(jié)點(diǎn)自身,并啟動(dòng)遞歸函數(shù)):func_Print()

    代碼如下

    int nRowOffSet = 0;

     

    #report.DelTailCol(#report.ColCount());

    #report.DelTailRow(#report.RowCount());

    #report.AddCol(1);

    #report.AddRow(1);

     

    #report.SetTxt(1,1,#tree.GetNodeTxt(#tree.GetCurSelNodeKey()));

    func_PrintToReport(#tree.GetCurSelNodeKey(),2,2,nRowOffSet);

    5)        在按鈕中鼠標(biāo)點(diǎn)擊動(dòng)作中輸入:func_Print();

    6)        運(yùn)行并查看效果。運(yùn)行時(shí),不選擇樹結(jié)點(diǎn),點(diǎn)擊按鈕后報(bào)表中打印出整棵樹,因?yàn)楦Y(jié)點(diǎn)文本為空,所以報(bào)表第一列為空。選中任意一個(gè)樹結(jié)點(diǎn)后,報(bào)表中打印出本分支所有結(jié)點(diǎn),包含本結(jié)點(diǎn)。

    效果圖如下:

     

     

           本文以RealInfo為例,講述了一種通過函數(shù)遞歸調(diào)用來實(shí)現(xiàn)樹形結(jié)構(gòu)數(shù)據(jù)遍歷的方法,其中遞歸函數(shù)體實(shí)現(xiàn)了打印指定結(jié)點(diǎn)的子結(jié)點(diǎn)功能。本方法適用于少量樹形結(jié)構(gòu)數(shù)據(jù)的遍歷,當(dāng)數(shù)據(jù)量過大時(shí)需要作進(jìn)一步優(yōu)化。

  • 企業(yè)介紹
紫金橋軟件研發(fā)始于1993年,是國(guó)家重點(diǎn)項(xiàng)目“九五攻關(guān)”與兩期國(guó)家“863計(jì)劃”的結(jié)晶。作為國(guó)家級(jí)高新技術(shù)企業(yè),紫金橋軟件不僅是國(guó)內(nèi)領(lǐng)先的工業(yè)控制軟件提供商,還憑借深厚的技術(shù)積累和行業(yè)影響力,持續(xù)為工業(yè)自動(dòng)化領(lǐng)域提供安全、可靠、高效的解決…  更多>>
  • 聯(lián)系方式

紫金橋軟件技術(shù)有限公司

聯(lián)系人:李磊

地址:黑龍江省大慶市高新區(qū)服務(wù)外包產(chǎn)業(yè)園C1-817室

郵編:163316

電話:400-678-6601

傳真:0459-8151391-808

公司網(wǎng)址:http://realinfo.cc

  • 該空間手機(jī)版

掃描此二維碼即可訪問該空間手機(jī)版

  • 在線反饋
1.我有以下需求:



2.詳細(xì)的需求:
姓名:
單位:
電話:
郵件:
您還沒有登錄,請(qǐng)登陸,
如果您還沒有注冊(cè),點(diǎn)擊這里注冊(cè).
  • 網(wǎng)友反饋
  • 戴永鐵 在2024/6/11 14:51:00留言
  • 留言類型:貴公司產(chǎn)品銷售人員聯(lián)系我,貴公司技術(shù)支持人員聯(lián)系我,
  • 詳細(xì)留言:需要制藥工業(yè)領(lǐng)域的實(shí)時(shí)庫報(bào)表,包含矩陣配?、參數(shù)配方、數(shù)據(jù)(統(tǒng)計(jì)和歷史)、曲線、事件、報(bào)警、審計(jì)追蹤,這些內(nèi)容可以組態(tài)化
  • 曉同 在2024/5/16 11:06:00留言
  • 留言類型:我讓貴公司產(chǎn)品銷售人員聯(lián)系我,
  • 詳細(xì)留言:紫金橋組態(tài)軟件V6.5,512點(diǎn)授權(quán)
  • 在2023/10/21 16:03:00留言
  • 留言類型:貴公司技術(shù)支持人員聯(lián)系我,
  • 詳細(xì)留言:OPC
  • 鄭鑫汶 在2023/6/1 14:58:00留言
  • 留言類型:我想得到貴公司產(chǎn)品詳細(xì)資料,我想得到貴公司產(chǎn)品的價(jià)格信息,我讓貴公司產(chǎn)品銷售人員聯(lián)系我,我讓貴公司技術(shù)支持人員聯(lián)系我,
  • 詳細(xì)留言:需要咨詢貴公司軟件的價(jià)格功能
  • 吳吉校 在2023/3/15 7:45:00留言
  • 留言類型:我想得到貴公司產(chǎn)品詳細(xì)資料,我想得到貴公司產(chǎn)品的價(jià)格信息,我讓貴公司產(chǎn)品銷售人員聯(lián)系我,我讓貴公司技術(shù)支持人員聯(lián)系我,
  • 詳細(xì)留言:組態(tài)軟件咨詢
更多請(qǐng)進(jìn)入空間管理中心查看
關(guān)于我們 | 網(wǎng)站地圖 | 聯(lián)系我們
© 2003-2018    經(jīng)營(yíng)許可編號(hào):京ICP證120335號(hào)
公安機(jī)關(guān)備案號(hào):110102002318  服務(wù)熱線:010-82053688
我要反饋