LeetCode進階559-廣度優先搜索(BFS)

概念

廣度優先搜索算法(英語:Breadth-First-Search,縮寫爲BFS),又譯做寬度優先搜索,或橫向優先搜索,是一種圖形搜索算法。簡單的說,BFS是從根節點開始,沿着樹的寬度遍歷樹的節點。若是全部節點均被訪問,則算法停止。廣度優先搜索的實現通常採用open-closed表。(摘自-維基百科)node

原題

559. Maximum Depth of N-ary Tree

Given a n-ary tree, find its maximum depth.算法

The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node.bash

For example, given a 3-ary tree: 數據結構

We should return its max depth, which is 3.

Note:ui

The depth of the tree is at most 1000.編碼

The total number of nodes is at most 5000.spa

559. N叉樹的最大深度

給定一個N叉樹,尋找樹的最大深度。設計

最大深度是指從根節點到最遠葉子節點的最長路徑上的節點總數。code

例如,3叉樹 : cdn

咱們應該返回的最大深度爲3。

注意:

樹的深度在1000之內。

樹的節點總數在5000之內。

  • 本題在LeetCode上屬於廣度優先搜索算法分類下

原題提示-節點數據結構Node

class Node {
		public int val;
		public List<Node> children;

		public Node() {
		}

		public Node(int _val, List<Node> _children) {
			val = _val;
			children = _children;
		}
	}
複製代碼

題意分析

根據題意,須要遍歷最深的節點路徑。由於不肯定同一層上某個節點是否具有子節點,所以須要遍歷每一層的全部節點,進而容易聯想到典型的廣度優先遍歷思想。

思路設計

某個節點的最大深度,須要遍歷全部當前節點的下一層子節點的深度,能夠得出這一層子節點的最大深度,最後子節點的最大深度加上當前節點深度1便可得出某個節點最大深度。

僞代碼:

一、判斷根節點是否爲空,爲空直接返回深度0;
     二、聲明最大深度int型變量depth=0表示子全部子節點的最大深度的最大值;
     三、循環遍歷根節點的全部子節點,循環長度等於子節點個數,而且子節點列表不爲空:
       i.獲取當前子節點的最大深度,遞歸調用,傳入當前子節點做爲新的根節點;
       ii.若子節點的最大深度大於當前記錄的最大深度depth,則更新depth爲當前子節點深度,做爲新的最大子節點深度
     四、最終返回根節點的最大深度爲全部子節點最大深度值+1;  
     
複製代碼

編碼實踐

public int maxDepth(Node root) {
		if (root == null) {
			return 0;
		}
		int max_depth = 0;
		for (int i = 0; i < root.children.size() && root.children != null; i++) {
			int d = maxDepth(root.children.get(i));
			if (d > max_depth) {
				max_depth = d;
			}
			//depth = (d > depth ? d : depth);
		}
		return max_depth + 1;
	}
複製代碼

彩蛋

上述題解編碼中,能夠看到有一句註釋//depth = (d > depth ? d : depth); 使用了三目運算符替代if,本篇的彩蛋就是簡單的if判斷爲何沒有使用三目運算而是使用的if,if必定比三目快嗎?到底應該選擇if仍是選擇三目呢?關於彩蛋,會在後續推文中揭曉答案,敬請期待!

結語

本篇題目相對簡單,重點理解廣度優先搜索算法思想和簡單實踐。關於廣度優先算法,後續仍有進階博客題解說明,一樣敬請期待!若是以爲本文對你有所幫助或啓發那就來個贊吧0.0~~

關注訂閱號 獲取更多幹貨~
相關文章
相關標籤/搜索