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...