欧美成人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免费视频_亚洲欧美激情小说另类_欧美激情一区二区三区视频_一级在线|欧洲

      欧美在线精品免播放器视频| 欧美va亚洲va香蕉在线| 欧美一区二区精品久久911| 亚洲欧美在线一区| 久久网站免费| 欧美高清在线视频观看不卡| 欧美日韩调教| 国产欧美日韩精品丝袜高跟鞋 | 羞羞视频在线观看欧美| 欧美一区二区在线观看| 久久免费视频网站| 欧美日韩精品免费观看视一区二区 | 亚洲国产精彩中文乱码av在线播放| 国产午夜精品理论片a级探花| 激情小说另类小说亚洲欧美| 亚洲开发第一视频在线播放| 翔田千里一区二区| 欧美成人蜜桃| 国产三级欧美三级日产三级99| 国语自产精品视频在线看一大j8| 亚洲激情国产| 久久久午夜精品| 欧美色大人视频| 激情自拍一区| 亚洲图片自拍偷拍| 欧美成人免费大片| 国产精品专区一| 亚洲精品视频一区二区三区| 欧美在线播放一区| 国产精品久久久久久久app| 在线观看免费视频综合| 亚洲欧美一区二区三区在线| 欧美国产三级| 在线精品高清中文字幕| 午夜久久福利| 欧美午夜一区| 亚洲精品偷拍| 欧美成人午夜免费视在线看片 | 国产乱人伦精品一区二区 | 久久av在线| 国产精品久久久久久久久动漫 | 亚洲日本中文字幕区| 欧美亚洲三区| 国产精品久久激情| 亚洲精品一线二线三线无人区| 欧美综合激情网| 国产日产精品一区二区三区四区的观看方式 | 黄色工厂这里只有精品| 欧美亚洲一级片| 国产精品自拍在线| 午夜一区不卡| 国产精品免费看| 亚洲免费在线精品一区| 欧美婷婷久久| 亚洲无线视频| 国产精品久久久久永久免费观看| 99av国产精品欲麻豆| 国产精品久久久免费| 亚洲激情另类| 欧美激情精品久久久久久大尺度| 亚洲国产精品va在看黑人| 久久影院午夜片一区| 国产一区二区中文字幕免费看| 久久精品国产视频| 一区二区视频免费在线观看| 免费观看在线综合| 9l视频自拍蝌蚪9l视频成人| 欧美日韩精品一区二区三区四区| 亚洲午夜视频在线| 国产精品v一区二区三区| 亚洲午夜精品17c| 国产老女人精品毛片久久| 欧美有码视频| 影音先锋成人资源站| 欧美激情一区二区三区四区| 夜夜爽99久久国产综合精品女不卡| 欧美日韩一区二区三| 羞羞色国产精品| 在线看不卡av| 欧美日韩美女一区二区| 亚洲欧美日韩一区二区在线 | 欧美一区午夜视频在线观看| 樱花yy私人影院亚洲| 欧美日韩mv| 欧美中文字幕| 999亚洲国产精| 国产日韩欧美高清免费| 欧美mv日韩mv国产网站| 在线视频欧美日韩精品| 韩国久久久久| 欧美日在线观看| 欧美一区二区高清在线观看| 最新国产精品拍自在线播放| 国产精品亚洲美女av网站| 久久综合伊人77777| 一本色道久久综合狠狠躁篇怎么玩| 国产精品男人爽免费视频1 | 国内视频一区| 欧美三级欧美一级| 久久久久久久999| 亚洲午夜羞羞片| 在线观看91精品国产麻豆| 国产精品国产三级国产专区53| 老鸭窝亚洲一区二区三区| 亚洲一区欧美一区| 亚洲麻豆av| 亚洲第一区色| 国产在线播精品第三| 国产精品v欧美精品v日韩| 欧美成人午夜剧场免费观看| 久久成人在线| 午夜伦理片一区| 9色porny自拍视频一区二区| 尤物九九久久国产精品的特点| 国产精品手机视频| 欧美网站在线观看| 国产欧美一区二区精品性色| 欧美精品色一区二区三区| 久久久久久亚洲精品不卡4k岛国| 亚洲欧美久久久久一区二区三区| 亚洲精品一区二区三| 尤物九九久久国产精品的特点| 国产一区二区黄| 国产亚洲精品久久久久动| 国产精品久久精品日日| 欧美性色aⅴ视频一区日韩精品| 欧美激情2020午夜免费观看| 欧美+亚洲+精品+三区| 蜜乳av另类精品一区二区| 久久夜色精品| 久久久噜噜噜久噜久久| 久久精品卡一| 久久伊人精品天天| 免费的成人av| 欧美激情综合网| 欧美黄色一级视频| 欧美日韩国产在线| 欧美日韩亚洲在线| 欧美天堂在线观看| 国产精品久久国产精品99gif| 国产精品成人一区二区网站软件 | 亚洲国产黄色| 亚洲精品乱码久久久久久蜜桃麻豆 | 精品999成人| 亚洲国产精品久久人人爱蜜臀| 在线精品视频一区二区| 最近中文字幕日韩精品 | 激情久久五月| 91久久线看在观草草青青| 最近看过的日韩成人| 夜夜爽99久久国产综合精品女不卡| 日韩视频专区| 亚洲欧美日韩国产中文| 欧美在线视频一区二区| 欧美h视频在线| 欧美日韩一区二区三区| 国产视频精品xxxx| 精品不卡一区| 在线视频你懂得一区| 香蕉久久夜色精品国产| 欧美成人dvd在线视频| 国产精品成人播放| 永久555www成人免费| 亚洲深夜av| 久久天天躁狠狠躁夜夜爽蜜月| 欧美久久一区| 国产小视频国产精品| 91久久国产综合久久| 亚洲欧美中文另类| 另类综合日韩欧美亚洲| 国产精品久久久久高潮| 激情六月综合| 亚洲亚洲精品三区日韩精品在线视频 | 欧美一区二区成人6969| 欧美电影免费观看大全| 国产精品伦一区| 亚洲人成亚洲人成在线观看| 午夜精品久久久久久久99水蜜桃 | 午夜久久资源| 欧美人妖在线观看| 一区在线视频| 欧美一区二区三区日韩视频| 欧美日本中文| 激情欧美一区二区| 亚洲永久免费| 欧美日韩高清在线播放| 在线成人av| 久久不见久久见免费视频1| 欧美视频在线观看免费网址| 亚洲高清在线观看一区| 久久精品九九| 国产日韩欧美精品在线| 一级日韩一区在线观看| 欧美精品午夜| 亚洲国产婷婷香蕉久久久久久99| 久久福利视频导航| 国产九区一区在线| 亚洲女性喷水在线观看一区| 欧美日韩免费观看一区=区三区| 亚洲精品1234|