欧美成人aaaaa免费视频_亚洲欧美激情小说另类_欧美激情一区二区三区视频_一级在线|欧洲

技術頻道

函數遞歸在樹形結構數據遍歷中的應用

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

#report.AddCol(1);

endif

for i=0 to nCount

if #report.RowCount()

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

文章版權歸西部工控xbgk所有,未經許可不得轉載。

欧美成人aaaaa免费视频_亚洲欧美激情小说另类_欧美激情一区二区三区视频_一级在线|欧洲

      9000px;">

          亚洲国产成人av网| 国产毛片精品视频| 欧美精品一区二区三区蜜桃视频 | 国产成人99久久亚洲综合精品| 日韩欧美成人一区二区| 国产一区二区三区电影在线观看| 中文字幕不卡一区| 欧美日韩精品三区| 久久99久久精品| 亚洲人成网站在线| 日韩免费观看2025年上映的电影 | 欧美在线免费观看亚洲| 免费精品99久久国产综合精品| 欧美一级在线视频| 91年精品国产| 国产精品一区在线观看你懂的| 亚洲精品亚洲人成人网在线播放| 精品噜噜噜噜久久久久久久久试看| 成人蜜臀av电影| 精品一区二区综合| 玉足女爽爽91| 久久久国产午夜精品| 欧洲一区二区三区在线| 国产传媒一区在线| 蜜臀av一区二区| 亚洲一本大道在线| 中文字幕不卡三区| 久久精品夜色噜噜亚洲a∨| 欧美乱妇15p| 色婷婷久久久亚洲一区二区三区| 国产高清视频一区| 蜜桃av一区二区在线观看| 亚洲一区在线看| 亚洲图片另类小说| 日韩理论片中文av| 中文久久乱码一区二区| 久久综合久久综合久久| 欧美一区二区高清| 欧美久久久影院| 日本高清成人免费播放| 91一区在线观看| 成人国产精品免费观看动漫| 国产精品一区二区三区99| 精品中文av资源站在线观看| 日韩av电影免费观看高清完整版在线观看| 亚洲欧美另类综合偷拍| 国产精品久久久久久久久免费相片 | 亚洲超丰满肉感bbw| 亚洲欧美日韩在线| 亚洲日本丝袜连裤袜办公室| 亚洲欧美日韩综合aⅴ视频| 最近日韩中文字幕| 自拍偷自拍亚洲精品播放| 国产精品成人免费精品自在线观看| 国产欧美一区二区三区在线看蜜臀| 欧美第一区第二区| 91精品午夜视频| 欧美一区二区三区免费大片| 欧美一级高清大全免费观看| 日韩女优制服丝袜电影| 久久精品一区二区三区不卡牛牛| 国产亚洲欧美日韩俺去了| 久久久美女艺术照精彩视频福利播放| 日韩免费福利电影在线观看| 91精品国产一区二区三区蜜臀 | 成人久久18免费网站麻豆| av一区二区三区在线| 一本大道综合伊人精品热热 | 精品福利一区二区三区免费视频| 精品国产a毛片| 国产精品丝袜在线| 悠悠色在线精品| 免费成人在线播放| 国产精品888| 91久久国产最好的精华液| 欧美日韩日日摸| 欧美精品一区二区在线观看| 国产精品国产三级国产三级人妇| 亚洲线精品一区二区三区八戒| 久久精品99国产精品| 99久久婷婷国产| 麻豆91小视频| 国产高清久久久久| 亚洲精品成人少妇| 亚洲图片欧美一区| 最新欧美精品一区二区三区| 一区二区在线电影| 精品亚洲欧美一区| 在线观看视频一区| 337p粉嫩大胆噜噜噜噜噜91av| 自拍视频在线观看一区二区| 久久国产精品第一页| 欧美在线免费播放| 久久嫩草精品久久久精品| 一区二区成人在线| 国产99精品在线观看| 欧美剧情电影在线观看完整版免费励志电影 | 日韩精品一区二区三区视频在线观看| 欧美一级日韩不卡播放免费| 亚洲欧美在线aaa| 久久精品国产第一区二区三区| 91麻豆文化传媒在线观看| 久久亚洲欧美国产精品乐播| 亚洲影院在线观看| 99re热视频这里只精品| 国产午夜精品美女毛片视频| 亚洲午夜免费福利视频| 国产成人在线视频网址| 欧洲色大大久久| 国产精品国产三级国产aⅴ入口| 奇米影视一区二区三区小说| 日本精品裸体写真集在线观看| 欧美国产精品中文字幕| 捆绑紧缚一区二区三区视频| 欧美精选一区二区| 日韩成人一级片| 日韩一区二区三区电影| 天天综合色天天综合色h| 欧美伊人精品成人久久综合97 | 91一区一区三区| 中文在线资源观看网站视频免费不卡 | 久久久精品人体av艺术| 日本亚洲免费观看| 4438亚洲最大| 极品美女销魂一区二区三区| 欧美va亚洲va| 激情深爱一区二区| 国产午夜亚洲精品不卡| 国产不卡在线视频| 中文字幕日本乱码精品影院| 国产 日韩 欧美大片| 日本一区二区成人| zzijzzij亚洲日本少妇熟睡| 国产精品国产三级国产普通话99| 99精品久久只有精品| 亚洲精选视频在线| 欧美日韩一区小说| 免费在线观看视频一区| 2017欧美狠狠色| 成人91在线观看| 亚洲精品视频一区二区| 在线成人高清不卡| 国产高清成人在线| 欧美极品aⅴ影院| 亚洲成人av电影| 国产精品国产三级国产三级人妇| 狠狠色2019综合网| 国产婷婷一区二区| 99久久精品免费| 亚洲自拍偷拍综合| 日韩午夜三级在线| av电影在线观看不卡| 亚洲va欧美va人人爽午夜| 91精品国产丝袜白色高跟鞋| 国产成人在线网站| 亚洲国产精品一区二区www| 日韩美女天天操| 97超碰欧美中文字幕| 亚洲不卡av一区二区三区| 欧美一级日韩一级| 91丨九色丨蝌蚪丨老版| 免费精品视频在线| 亚洲日本在线a| 精品久久久久久久久久久久久久久 | 日韩一区二区三区电影| 精品国产一区久久| 99国产精品99久久久久久| 一区二区三区中文字幕在线观看| 777亚洲妇女| 国产99精品国产| 亚洲一区二区三区四区在线免费观看 | 欧美日韩一区 二区 三区 久久精品| 激情另类小说区图片区视频区| 亚洲色图视频网站| 日韩欧美中文字幕制服| 91天堂素人约啪| 精品亚洲aⅴ乱码一区二区三区| 国产精品久久久久久久岛一牛影视| 欧美日韩国产综合一区二区三区| 99久久精品免费观看| 国产午夜亚洲精品理论片色戒| 久久精品视频免费观看| 韩国精品免费视频| 国产精品乱码久久久久久| 色久优优欧美色久优优| 国产精品影视在线| 毛片av中文字幕一区二区| 亚洲综合色区另类av| 日韩一区在线看| 国产精品久久久久四虎| 欧美zozo另类异族| 日韩欧美综合一区| 91麻豆精品国产91久久久久| 色噜噜狠狠成人网p站| 一本大道综合伊人精品热热 | 国产超碰在线一区| 韩国精品一区二区| 国产精品主播直播| 蜜臀久久99精品久久久久宅男| 亚洲午夜免费电影|