无码中文字幕色专区_91av俱乐部_无码人妻h动漫_26uuu成人_91九色丨porny丨国产jk_青青视频在线播放_国内自拍第二页_国产又粗又长又爽又黄的视频_色哟哟免费网站_久久出品必属精品_a级黄色一级片_99日在线视频

首頁 新聞 工控搜 論壇 廠商論壇 產(chǎn)品 方案 廠商 人才 文摘 下載 展覽
首頁 | 培訓(xùn)研討 | 公司簡介 | 聯(lián)系方式 | 公司動態(tài) | 產(chǎn)品 | 應(yīng)用實例 | 下載 | 文摘 | 誠聘 |
函數(shù)遞歸在樹形結(jié)構(gòu)數(shù)據(jù)遍歷中的應(yīng)用

紫金橋軟件技術(shù)有限公司
收藏本文     查看收藏
 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

       工程制作過程如下:

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

2)        創(chuàng)建窗口函數(shù)(用于得到指定結(jié)點的子結(jié)點編碼數(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é)點的子結(jié)點,不打印自身結(jié)點)

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é)點

              #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é)點自身,并啟動遞歸函數(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)點擊動作中輸入:func_Print();

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

效果圖如下:

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


 

狀 態(tài): 離線

公司簡介
產(chǎn)品目錄

公司名稱: 紫金橋軟件技術(shù)有限公司
聯(lián) 系 人: 李磊
電  話: 0459-8151391-808
傳  真: 0459-8151391-804
地  址: 大慶市高新區(qū)服務(wù)外包產(chǎn)業(yè)園C-1座817室
郵  編: 163316
主  頁:
 
紫金橋軟件相關(guān)文摘:
跨平臺實時數(shù)據(jù)庫變量引用導(dǎo)航功能介紹
跨平臺實時數(shù)據(jù)庫 如何利用MODBUS仿真軟件測試MODBUS驅(qū)動
紫金橋跨平臺實時數(shù)據(jù)庫如何實現(xiàn)多屏顯示
紫金橋跨平臺軟實時數(shù)據(jù)庫Web服務(wù)器和數(shù)據(jù)服務(wù)器分離訪問的配置
紫金橋跨平臺軟件遠程采集RealInfo6.5
使用虛擬機做的工程實現(xiàn)跨網(wǎng)Web訪問
紫金橋軟件Microsoft Office Access 2003的ODBC數(shù)據(jù)源配置
紫金橋軟件閘門整體自動化監(jiān)控系統(tǒng)
通過紫金橋軟件來提高畫面組態(tài)速度
組態(tài)軟件在配套設(shè)備中的應(yīng)用
紫金橋的關(guān)系庫同步工具簡介
紫金橋組態(tài)軟件與歐姆龍PLC以太網(wǎng)通信(FINS命令)——CPU型號-CJ2M-CPU33
更多紫金橋軟件文摘...
通過中華工控網(wǎng)在線留言紫金橋軟件技術(shù)有限公司:
用戶名: 密碼: 免費注冊為中華工控網(wǎng)會員
請留下您的有效聯(lián)系方式,以方便我們及時與您聯(lián)絡(luò)
 
中華工控網(wǎng) GKong.com制作發(fā)布 廣告聯(lián)系
无码中文字幕色专区_91av俱乐部_无码人妻h动漫_26uuu成人_91九色丨porny丨国产jk_青青视频在线播放_国内自拍第二页_国产又粗又长又爽又黄的视频_色哟哟免费网站_久久出品必属精品_a级黄色一级片_99日在线视频
免费欧美一区| 亚洲午夜在线| 婷婷精品在线| 日韩理论视频| 日韩免费小视频| 亚洲女同av| 精品精品99| 91久久中文| 亚洲一区二区三区免费在线观看| 精品美女久久| 亚洲v天堂v手机在线| 欧美+日本+国产+在线a∨观看| 亚洲精品福利电影| 久久青草久久| 国产日韩在线观看视频| 激情久久五月| 亚洲天堂日韩在线| 日韩国产激情| 亚洲精品99| 亚洲少妇一区| 成人在线黄色| 婷婷六月综合| 国产欧美精品| 久久香蕉国产| 久久影院资源站| 99国产一区| 国产精品久久| 日韩一级不卡| 日韩中文字幕麻豆| 日本a口亚洲| 欧美日韩99| 国产亚洲一区二区手机在线观看| 日韩a一区二区| 亚洲二区三区不卡| 国产日产一区| 在线亚洲激情| 精品欧美一区二区三区在线观看| 久久一区二区三区喷水| 国产精品久久久久9999高清| 久久精品一区二区国产| 四虎精品永久免费| 亚洲美女91| 99久久精品网| 日韩欧美字幕| 日韩高清在线不卡| 天海翼精品一区二区三区| 亚洲激情二区| 日韩精品一区二区三区av | 中文字幕一区二区三区日韩精品| 亚洲婷婷免费| 韩日一区二区| 亚洲女同av| 欧美日韩国产一区二区三区不卡| 日韩欧美中文字幕一区二区三区 | 婷婷精品进入| 色综合www| 99精品视频在线| 欧美天堂视频| 最近高清中文在线字幕在线观看1| 国产欧美日韩精品一区二区免费 | 亚洲视频www| 欧美日韩在线播放视频| 欧美1区免费| 视频一区中文字幕精品| 亚洲作爱视频| 欧美另类中文字幕| zzzwww在线看片免费| 免费在线日韩av| 九九99久久精品在免费线bt| 亚洲伦乱视频| 日本综合精品一区| 日韩avvvv在线播放| 欧美一区91| 欧美www视频在线观看| 9国产精品视频| 欧美国产日本| 中文精品电影| 国产精品毛片视频| 波多野结衣一区| 狠狠爱成人网| 亚洲午夜久久久久久尤物| 日韩精品免费观看视频| 日韩a一区二区| 日韩在线高清| 日韩不卡一区二区| 不卡在线一区二区| **爰片久久毛片| 亚洲啊v在线免费视频| 欧美另类中文字幕| 一区二区日韩免费看| 精品国产成人| 欧美精品不卡| 国产伦乱精品| 免费精品视频| 日韩高清不卡一区二区| 韩日一区二区| 国产精品3区| 日韩av午夜在线观看| 石原莉奈在线亚洲三区| 国产亚洲综合精品| 91久久久精品国产| 99精品电影| 欧美日韩尤物久久| 欧美日韩国产高清| 亚洲激情中文| 久久国产高清| 激情婷婷久久| 蜜乳av另类精品一区二区| 日韩在线网址| 亚洲天堂日韩在线| 亚洲有吗中文字幕| 国产精品一二| 日韩理论视频| 久久国产高清| 国产成人久久| 日韩久久精品| 亚欧成人精品| 亚洲一级在线| 免费视频亚洲| 亚洲激情av| 免费日韩精品中文字幕视频在线| 国产传媒在线| 中文字幕在线免费观看视频| 国产欧美亚洲精品a| 91麻豆精品激情在线观看最新| 日韩国产成人精品| 青青伊人久久| 欧美日韩精品一本二本三本| 一区二区91| 欧美日韩亚洲国产精品| 在线综合视频| 免费亚洲一区| 中文精品在线| 成人在线视频区| 国产福利电影在线播放| 欧美91视频| 视频一区视频二区中文字幕| 日韩精品乱码av一区二区| 国产精品99久久免费观看| 国产精品一区二区av日韩在线 | 国产欧美日韩在线一区二区| 日韩精品一区二区三区中文在线| 青青草视频一区| 精品日本视频| 亚洲高清av| 中文字幕中文字幕精品| 中国字幕a在线看韩国电影| 婷婷色综合网| 欧美有码在线| 99热精品久久| 国产精品一区二区三区美女| 精品久久美女| 石原莉奈在线亚洲二区| 久久精品一区| 视频一区日韩| 国产精品人人爽人人做我的可爱| 美女尤物久久精品| 美女性感视频久久| 欧美另类综合| 国产成人久久精品一区二区三区| 国产亚洲一级| 欧美理论视频| 福利在线免费视频| 日本久久一区| 欧美日韩国产精品一区二区亚洲| 国产精品视频3p| 在线日韩成人| 欧美日韩国产在线一区| 免费观看久久av| 国产偷自视频区视频一区二区| 三级小说欧洲区亚洲区| 久久婷婷av| 亚洲中午字幕| 久久精品国产99国产| 亚洲一级少妇| 国产日韩视频| 欧美~级网站不卡| 国产精品色在线网站| 日韩精品一区第一页| 色一区二区三区| 国产午夜一区| 欧美 日韩 国产一区二区在线视频 | 最新国产精品| 欧洲av一区二区| 国产日韩亚洲欧美精品| 亚洲精品女人| 日韩一区精品视频| 国产农村妇女精品一区二区| 日韩中文在线电影| 麻豆视频在线观看免费网站黄| 美腿丝袜亚洲三区| 另类综合日韩欧美亚洲| www.九色在线| 久草精品视频| 免费视频一区二区三区在线观看 | 99精品小视频| 欧美日韩免费观看一区=区三区| 欧美aa在线观看| 欧美成人午夜| 蜜桃国内精品久久久久软件9|