1. 程式人生 > >日常小結-層序遍歷的實現leetcode 297

日常小結-層序遍歷的實現leetcode 297

層序遍歷的實現leetcode 297-Serialize and Deserialize Binary Tree

最近在寫leetcode的測試集,目前想實現一個輸入string型別的陣列得到對應樹的去序列化程式。正好這題跟297其實是一個意思,然後就順帶看了下。看了幾個最高讚的答案發現作者其實挺雞賊的。幾個答案都是按DFS方法做的。但是其實這幾個方法得到的樹結果貌似是錯的。只是因為測試集先呼叫了序列化在調取序列化當然對了。不知道有沒有其他沒有注意到的地方。暫時看是這樣。
這些 先不管這些。這裡簡單介紹下層序遍歷的實現。不過我這是野路子。不知道正規方法是什麼樣的。程式碼就不貼了網上有很多這裡把思路總結下:

  • 首先你需要一個佇列。原因很簡單。其實層序序列是BFS實現的佇列裡的物件相當於每層需要依次考慮的佇列,泛泛的來談的話,個人覺得DFS基本上是用棧,因為要把當前層需要考慮的問題前置,而BFS需要用佇列因為需要按層次順序考慮問題。這裡的佇列放置的就是每一層需要考慮的問題,也就是需要新增子節點的父節點。
  • 其次,有了佇列過後,需要知道的是這裡並不像DFS那樣將用迭代解決問題,這裡用的是非迭代的問題。當佇列裡面沒有值的時候也就說明當前當前佇列裡放的是最後一層的節點,且這些節點已經處理完了。

有了上面的分析基礎解決問題就好解決了,具體的說:

  1. 初始化,建立根節點然後用res指標指向它,把它作為迭代的起始點,並將其放到佇列中,接下來進入迴圈。
  2. 如果當前佇列有節點,說明有子節點有空位,需要新增問題繼續,否則問題終止。 進入迴圈後,首先把當前指標指向的佇列中第一個節點出列。
  3. 判斷流裡的資料是否已經結束,如果沒有結束則繼續,建立一個節點把節點放入到當前cur指標的左端點,並把這個節點push到佇列中,任務完成。
  4. 對當前節點的右分支做相同的操作。
  5. 不難判斷以上問題的終止條件是佇列為空。問題解決。