樹的深度優先搜尋和廣度優先搜尋的實現

2021-10-02 15:42:20 字數 2591 閱讀 6905

depth first search,dfs

可以使用先序遍歷來實現

遞迴版

//先序遍歷

public

void

preorder

(binarytreenode node)

}

遞迴求樹高

public

intmaxdepth

(treenode root)

int leftheight =

maxdepth

(root.left)

;int rightheight =

maxdepth

(root.right)

;return

1+math.

max(leftheight,rightheight)

;}

非遞迴版(使用棧實現)

public arraylist

dfstree

(treenode root)

return lists;

}

非遞迴求樹高

// class deepthnode

// }

public

intmaxdepth

(treenode root)

stack.

push

(new

deepthnode

(root,1)

);int deep =0;

int currentdeep =0;

while

(!stack.

isempty()

)if(deepthnode.node.left!=null)

deep = math.

max(deep, currentdeep);}

return deep;

}}

bfs使用佇列實現廣度優先搜尋基本操作是和深度優先差不多的,只不過這裡是通過佇列來實現的,找到乙個起點a,並將a相鄰的點放入佇列中,這時將隊首元素b取出,並將b相鄰且沒有訪問過的點放入佇列中,不斷重複這個操作,直至佇列清空,這個時候依次訪問的頂點就是遍歷的順序。

廣度優先遍歷樹,需要用到佇列(queue)來儲存節點物件,佇列的特點就是先進先出。先往佇列中插入左節點,再插入右節點,佇列出隊就是先出左節點,再出右節點。

首先將a節點插入佇列中,佇列中有元素(a);

將a節點彈出,同時將a節點的左節點b、右節點c依次插入佇列,b在隊首,c在隊尾,(b,c),此時得到a節點;

將隊首元素b彈出,並將b的左節點d、右節點e插入佇列,c在隊首,e在隊尾(c,d,e),此時得到b節點;

再將隊首元素c彈出,並將c節點的左節點f,右節點g依次插入佇列,(d,e,f,g),此時得到c節點;

將d彈出,此時d沒有子節點,佇列中元素為(e,f,g),得到d節點;

。。。以此類推。最終的遍歷結果為:a,b,c,d,e,f,g,h,i。

public arraylist

bfstree

(treenode root)

return lists;

}

如果在廣度優先搜尋的時候對層級的記錄有要求使用巢狀迴圈結構,該方法的每一步都需要記錄當前佇列中全部元素數量,對應樹中乙個層級元素的數量。然後從佇列中處理對應數量的元素。完成後,這一層級所有的節點都被訪問,佇列包含下一層級的全部節點。下面是對應偽**

while

(!q.

empty()

)if(node.right!=null)

}}

給定乙個二叉樹,返回其按層次遍歷的節點值(即逐層地,從左到右訪問所有節點)

例如:給定二叉樹: [3,9,20,null,null,15,7]

3

/ \ 9

20/ \157

返回

[[3

],[9

,20],

[15,7

]]

這個和上面的層次遍歷不同的地方在於要把每一層都記錄在乙個list中,做法是利用佇列遍歷二叉樹,內層迴圈次數是每層節點數,每遍歷完一層,加入list

class

solution

queue.

add(root)

;while

(!queue.

isempty()

)if(node.right!=null)

} result.

add(inner);}

return result;

}}

樹搜尋 深度優先和廣度優先

在android開發中,有時候會遇到多層級列表的顯示,如下圖,可用recyclerview實現。其資料來源的資料結構是一種樹狀結構,如下圖 現在有兩種方法來遍歷這種資料結構。深度優先搜尋 其過程簡要來說是對每乙個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一次。舉例說明之 據上圖,我們從...

深度優先搜尋和廣度優先搜尋

深度優先的思想是先記住當前的起點,然後選定乙個方向一條道走到黑,若失敗則回到起點再選定另外乙個方向走到黑。廣度優先的思想是記住當前的起點,然後選定各個方向的相鄰點作為新的起點,再繼續。可以看出,深度優先和廣度優先都需要記住當前的起點,不同的是深度優先每次只需要記住乙個方向的相鄰點,廣度優先則要記住所...

廣度優先搜尋和深度優先搜尋

dbf深度優先搜尋,最經典的方法,可以使用遞迴來實現。結構體定義 typedef char vertextype typedef int edgetype define maxvex 100 define infinite 65535 typedef struct mgraph 測試函式如下 mgr...