<style id="7i3y3"></style>

      <sub id="7i3y3"><i id="7i3y3"></i></sub>

        午夜精品一区二区三区成人,中文字幕av一区二区,亚洲AVAV天堂AV在线网阿V,肥臀浪妇太爽了快点再快点,国产网友愉拍精品视频手机,国产精品无码a∨麻豆,久久中文字幕一区二区,a级国产乱理伦片在线观看al
        首頁 新聞 工控搜 論壇 廠商論壇 產品 方案 廠商 人才 文摘 下載 展覽
        中華工控網首頁
          P L C | 變頻器與傳動 | 傳感器 | 現場檢測儀表 | 工控軟件 | 人機界面 | 運動控制
          D C S | 工業以太網 | 現場總線 | 顯示調節儀表 | 數據采集 | 數傳測控 | 工業安全
          電 源 | 嵌入式系統 | PC based | 機柜箱體殼體 | 低壓電器 | 機器視覺
        函數遞歸在樹形結構數據遍歷中的應用
        紫金橋軟件技術有限公司
        收藏本文     查看收藏
         

               我們在使用樹形結構數據時,常常需要遍歷整棵樹或某一支下的所有結點,用于查找、打印等功能。因為樹形結構不同于數組、鏈表等簡單數據結構,它像樹枝一樣每個根結點可以具有多個子結點,無限延展,因此需要專門的算法去遍歷。樹形結構的遍歷有很多種方法,下面我們以紫金橋監控組態軟件(以下簡稱為“RealInfo)為例,簡單講解函數遞歸在這種遍歷方法中的應用。

               RealInfo中,“樹形控件”是表示樹狀結構數據的組件,“自由報表”是表示表格數據的組件,這兩種組件自身都提供了一些常用方法。我們現在實現這樣的功能:將樹形控件中的指定分支數據打印在自由報表中。可以利用窗口自定義函數的遞歸功能。

               樹形控件中的數據顯示方式如下圖所示:

               每個結點以結點編碼為唯一標識,每個結點可以顯示一個字符串作為結點文本(詳見RealInfo聯機幫助)。

               本例中,我們將樹形結構數據打印在自由報表上,其效果如下圖所示:

               每個根結點打印完成后,遇到子結點時打印位置自動向右、向下移動一個單元格;遇到兄弟結點時打印位置向下移動一個單元格。

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

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

        1)        當所在結點具有子結點時,那么按自左向右原則,接著訪問它的第一個子結點,直到所在結點沒有子結點為止。

        2)        當所在結點沒有子結點,但具有兄弟結點時,那么按自上向下原則依次訪問它的兄弟結點。

        3)        當所在結點沒有子結點,而且沒有兄弟結點時,那么按自上向下原則訪問它父結點的兄弟結點。

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

        這個函數用于根據輸入的父結點編碼和起始打印位置將其所有子結點打印出來。算法如下:

               函數首先判斷輸入結點是否具有子結點,如果沒有則返回,如果有則取得子結點列表,然后循環打印每個子結點并遞歸調用自身函數打印其子結點,當一個結點a的子結點打印完畢并返回后按相同規則依次打印的a結點的兄弟結點,直到所有兄弟結點打印完畢為止。

               工程制作過程如下:

        1)        新建窗口,創建樹形控件,起名為“tree”;創建自由報表起名為“report”;創建一個按鈕。

        2)        創建窗口函數(用于得到指定結點的子結點編碼數組):

        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)        創建窗口函數(用于遞歸打印指定結點的子結點,不打印自身結點)

        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]);       //打印本結點

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

                      nRowOffset = nRowOffset + 1;

                      nRowOffset = func_PrintToReport(strArrChildNodeKeys[i]

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

               next

        endif

        return nRowOffset;

        4)        創建窗口函數(用于打印初始結點自身,并啟動遞歸函數):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)        在按鈕中鼠標點擊動作中輸入:func_Print();

        6)        運行并查看效果。運行時,不選擇樹結點,點擊按鈕后報表中打印出整棵樹,因為根結點文本為空,所以報表第一列為空。選中任意一個樹結點后,報表中打印出本分支所有結點,包含本結點。

        效果圖如下:

               本文以RealInfo為例,講述了一種通過函數遞歸調用來實現樹形結構數據遍歷的方法,其中遞歸函數體實現了打印指定結點的子結點功能。本方法適用于少量樹形結構數據的遍歷,當數據量過大時需要作進一步優化。


         

        狀 態: 離線

        公司簡介
        產品目錄

        公司名稱: 紫金橋軟件技術有限公司
        聯 系 人: 李磊
        電  話: 0459-8151391-808
        傳  真: 0459-8151391-804
        地  址: 大慶市高新區服務外包產業園C-1座817室
        郵  編: 163316
        主  頁:
         
        該廠商相關技術文摘:
        跨平臺實時數據庫變量引用導航功能介紹
        跨平臺實時數據庫 如何利用MODBUS仿真軟件測試MODBUS驅動
        紫金橋跨平臺實時數據庫如何實現多屏顯示
        紫金橋跨平臺軟實時數據庫Web服務器和數據服務器分離訪問的配置
        紫金橋跨平臺軟件遠程采集RealInfo6.5
        使用虛擬機做的工程實現跨網Web訪問
        紫金橋軟件Microsoft Office Access 2003的ODBC數據源配置
        紫金橋軟件閘門整體自動化監控系統
        通過紫金橋軟件來提高畫面組態速度
        組態軟件在配套設備中的應用
        紫金橋的關系庫同步工具簡介
        紫金橋組態軟件與歐姆龍PLC以太網通信(FINS命令)——CPU型號-CJ2M-CPU33
        更多文摘...
        立即發送詢問信息在線聯系該技術文摘廠商:
        用戶名: 密碼: 免費注冊為中華工控網會員
        請留下您的有效聯系方式,以方便我們及時與您聯絡

        關于我們 | 聯系我們 | 廣告服務 | 本站動態 | 友情鏈接 | 法律聲明 | 不良信息舉報
        工控網客服熱線:0755-86369299
        版權所有 中華工控網 Copyright©2022 Gkong.com, All Rights Reserved

        主站蜘蛛池模板: 亚洲v欧美v日韩v国产v| 国精产品一品二品国精破解| 久久精品熟女亚洲av艳妇| AV在线亚洲欧洲日产一区二区| 亚洲色欲色欲WWW在线丝| 日韩精品亚洲精品第一页| 疯狂做受XXXX高潮国产| 亚洲色大成网站www永久男同| 久久精品国产久精国产69| 精品国产人妻一区二区三区久久| 中文无码乱人伦中文视频在线| 国产一区二区免费播放| 亚洲av第三区国产精品| 人妻伦理在线一二三区| 亚洲最大的成人网站| 亚洲最大有声小说AV网| 亚洲精品一二三四区| 88国产精品视频一区二区三区| 亚洲熟妇激情视频99| 蜜臀久久精品亚洲一区| 亚洲欧美乱综合图片区小说区 | 欧美日韩v| 中文字幕乱妇无码AV在线| 日本一区二区在线高清观看| 国产偷国产偷高清精品| 国产精品中文字幕在线| 国产小嫩模无套中出| 国产午夜亚洲精品福利| 国产精品成人观看视频国产奇米| 少妇撒尿一区二区在线视频| 日本人妻巨大乳挤奶水免费| 在线观看国产成人av天堂| 亚洲精品国产aⅴ成拍色拍| 日本国产精品第一页久久| 嫩草院一区二区乱码| 极品美女高潮呻吟国产剧情| 小嫩批日出水无码视频免费| 无码少妇高潮浪潮av久久| 岛国岛国免费v片在线观看| 亚欧色一区w666天堂| 深夜在线观看免费av|