1 廣度優先遍歷
1.1 概念
①以初始節點V0作為第一層節點,接着訪問它。
②然后迭代第一層節點即V0,訪問它相鄰接的沒有訪問過的節點比如V1,V2,V1,V2加入到第二層節點
③迭代第二層節點V1,V2,V1,V2依次訪問相鄰接的沒有訪問過的節點,重復上述步驟直至所有節點都被訪問過為止。
1.2圖解
如圖所示首先訪問根節點v0,並將v0加入到第一層。迭代第一層節點,和vo相鄰接的沒有訪問過的節點有v1和v2,訪問v1和v2,並將v1和v2加入到第二層,迭代第二層中的節點v1和v2,和v1相鄰接的沒有訪問過的節點有v3,v4,訪問v3和v4,並加入到第三層,和v2相鄰接的沒有訪問過的節點有v5和v6,訪問v5和v6,並加入到第三層。
1.3代碼
public class BFSDemo {
public void bfs(TreeNode root) {
if(root == null) {
return;
}
Queue<TreeNode> q = new LinkedList<>();
q.offer(root);
int size = q.size();
TreeNode temp = null;
while(!q.isEmpty()){
size = q.size();
while(size>0){
temp = q.poll();
if(temp.left != null){
q.offer(temp.left);
}
if(temp.right != null){
q.offer(temp.right);
}
size--;
}
}
return;
}
2.深度優先遍歷
2.1概念
①從給定的一個節點v0作為起點,訪問它。
②以v0作為起點,找到一個和它相鄰且未被訪問過節點v1,重復上述步驟。
③當到達一個節點vi,它所有相鄰的節點都被訪問過,那么就回退到vi-1,去找和它相鄰且未被訪問過節點。重復這一步,直到訪問過的頂點在也找不到和它相鄰且未被訪問過的節點。
2.2圖解
①v0->v1->v3
②回退到v1,->v3
③回退到v0, ->v2->v5
④回退到v2, ->v6
2.3代碼
public class DFSDemo {
public void dfs(TreeNode root) {
if(root == null ) {
return;
}
dfs(root.left);
dfs(root.right);
return;
}
}
3例題
給定一個二叉樹,找出其最大深度。
二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。
說明: 葉子節點是指沒有子節點的節點。
示例:
給定二叉樹 [3,9,20,null,null,15,7]
返回它的最大深度 3 。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
3.1分析
可以采用廣度優先遍歷,第一層深度為1,每增加一層深度加一
也可以采用深度優先遍歷,訪問每個節點時判斷它和最大深度之間的大小。或者計算左子樹深度和右子樹的深度,取他們之間的最大值然后加1。
public class BFSDemo {
public int maxDepth(TreeNode root) {
if(root == null) {
return 0;
}
Queue<TreeNode> q = new LinkedList<>();
q.offer(root);
int size = q.size();
TreeNode temp = null;
int level = 0;
while(!q.isEmpty()){
size = q.size();
while(size>0){
temp = q.poll();
if(temp.left != null){
q.offer(temp.left);
}
if(temp.right != null){
q.offer(temp.right);
}
size--;
}
level++;
}
return level;
}
}
public class DFSDemo {
int max = 0;
public int maxDepth(TreeNode root) {
if(root == null){
return 0;
}
dfs(root,1);
return max;
}
public void dfs(TreeNode node, int level){
if(node.left == null && node.right == null&&level>max){
max = level;
}
if(node.left != null){
dfs(node.left,level+1);
}
if(node.right != null){
dfs(node.right,level+1);
}
}
}
public class DFSDemo {
public int maxDepth(TreeNode root) {
if(root == null) {
return 0;
}
int left = maxDepth(root.left);
int right = maxDepth(root.right);
return Math.max(left,right) + 1;
}
}