leetcode 863 廣度優先和深度優先的應用

2021-09-26 11:19:30 字數 1163 閱讀 4561

給定乙個二叉樹(具有根節點root),乙個目標節點target以及乙個整數值k

返回到目標結點target距離為k的所有結點的值的列表。 答案可以以任何順序返回。

示例:

可以從示例中發現,這顆樹是用陣列儲存的,所以馬上想到了第乙個思路

:遍歷陣列,找出目標值,然後再用 節點 i 的子節點是 2i + 1 和 2i + 2,根據乙個 for 迴圈來找出距離他為 k(即第 k 個子孫節點)。

但是這樣太暴力了,所以沒有採取。

因為這是一顆樹,目標點都是明確的,但此題的提示中這顆樹最多由1000個節點,在一開始查詢目標值的時候便用廣度搜尋的話,記憶體的消耗會是極大的,所以使用深度搜尋查詢到 target 的時候再用廣度搜尋來進行查詢,這樣會是乙個很好的辦法。

關於廣度搜尋和深度搜尋可以參考 這裡

很詳細易懂。

具體的思路:

當以某個節點為根時,他與他的直系子孫節點的距離為 n 和所在層數是相同的,設h為層數,則有以下關係:n = h(target) - h(root)

深度搜尋目標節點,並且記錄該路徑,並將路徑上的點賦予父節點

然後向下進行廣度搜尋,將其所有適合的子孫節點都拿出來

回溯路徑,對路徑上的節點的兄弟節點進行廣度搜尋,將合適的子孫節點拿出來

所需函式:

找出目標節點位置並且記錄路徑的函式,並且將路徑上的值都加上父節點

給於乙個節點,以及距離k,便能求出距離他為k的所有子孫節點的函式

r如圖所示,若想查詢與 節點7 的 距離為 3 的節點,便可以用深度搜尋來查詢節點並且記錄路徑 4 -> 8 -> 7,然後用廣度搜尋分別堆路徑上的節點進行搜尋,例如此圖:查詢與 節點7 距離為 3 的節點,可以得出 32 75 51

查詢與 節點8 距離為 2 的節點, 便可以得出3 5 10 ,但是 10 是顯然不對的 所以我們只需要在 節點8 的左子樹上搜尋就行了 便可以的出 3 5

節點4 可以用以上的步驟, 可以得出 2

這三個結果便是所有 與 節點7 的距離為 3 的結果了。

leetcode之廣度優先搜尋

在二叉樹中,根節點位於深度 0 處,每個深度為 k 的節點的子節點位於深度 k 1 處。如果二叉樹的兩個節點深度相同,但父節點不同,則它們是一對堂兄弟節點。我們給出了具有唯一值的二叉樹的根節點 root,以及樹中兩個不同節點的值 x 和 y。只有與值 x 和 y 對應的節點是堂兄弟節點時,才返回 t...

LeetCode廣度優先演算法的題

真的坑,自己想完全沒想到,看了一些大神的部落格寫出來的。那個列表很坑,不能寫在一起。但作為一名小白還是很欣慰的。給定乙個由 1 陸地 和 0 水 組成的的二維網格,計算島嶼的數量。乙個島被水包圍,並且它是通過水平方向或垂直方向上相鄰的陸地連線而成的。你可以假設網格的四個邊均被水包圍 考慮這個題目,計...

LeetCode中BFS(廣度優先搜尋)

如下所示,廣度優先演算法會優先遍歷每一層 a b c d e利用佇列可實現廣度優先遍歷 127.單詞接龍 給定兩個單詞 beginword 和 endword 和乙個字典,找到從 beginword 到 endword 的最短轉換序列的長度。轉換需遵循如下規則 每次轉換只能改變乙個字母。轉換過程中的...