[LeetCode]problem 116. Populating Next Right Pointers in Each Node

TAG

層序遍歷 - 常量空間,通過next指針

二叉樹

link

方法

看到題,想了一下,得用層序遍歷!

做法是:

  1. 用兩個vector,第一個vector用來依次存當前層的父節點,另一個vector用來依次存下一層的孩子節點。

  2. 初始時將root節點放入第一個vector,然後只要第一個vector不空,則循環:

  3. 對第一個vector中每個節點,把非空孩子節點依次放入第二個vector中;

  4. 放完後,連接第二個vector中的節點,很簡單地連接。

  5. 最後交換vector1和vector2(爲下次循環準備),開始下次循環。

然而,卻要求用常量空間!也就是不能用上述方法…

然後我就懵了。於是我看了DISCUZZ,結果看了一眼代碼,沒看細緻就覺得我懂了…

這是什麼原因呢?自己給自己設限了嗎?

我們可以用next指針來輔助做層序遍歷啊!!

  1. 每次取每層的第一個節點,用來開始本層的訪問以及下層的進入。

  2. 每層的訪問,設一個訪問指針,初始爲每層第一個節點,只要訪問指針非空,就把訪問指針的左孩子的next連上該指針的右孩子;如果訪問指針next非空,就把右孩子的next指針連上next節點的左孩子。然後將訪問指針設爲next指針。

  3. 進入下一層:去下層第一個節點等於本層第一個節點的左孩子。此時下層的next指針鏈已經由上層構建好了!

  4. 如果本層第一個節點爲空,或者本層第一個節點無左孩子(此時無需構建下層,而本層已經構建完成),那麼退出循環。

總結來說,就是用上層構建好下層,通過next指針來完成層序的訪問。

想想還是很巧妙的。

可惜沒有想出來啊… 感覺自己沒有去嘗試,只圍繞這一個點思考… 這個題這麼形象,理論上可以做到的啊.. 最近還是精神狀態不太好啊(擔心找工作的事呢)

代碼

/**
 * Definition for binary tree with next pointer.
 * struct TreeLinkNode {
 *  int val;
 *  TreeLinkNode *left, *right, *next;
 *  TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {}
 * };
 */
class Solution {
public:
    void connect(TreeLinkNode *root) {
        TreeLinkNode * firstNodeOfLevel = root ;
        while(firstNodeOfLevel && firstNodeOfLevel->left)
        {

            TreeLinkNode * traversalPtr = firstNodeOfLevel;
            while(traversalPtr)
            {
                // link left -> right
                traversalPtr->left->next = traversalPtr->right ;
                TreeLinkNode *next = traversalPtr->next ;
                if(next)
                {
                    // link right -> left_of_next
                    traversalPtr->right->next = next->left;
                }
                traversalPtr = next ;
            }
            firstNodeOfLevel = firstNodeOfLevel->left;
        }
    }
};

後記

不明白我的代碼爲什麼這麼慢呢… 看了下他們確切的實現,也是如此啊..

另外,使用此方法遞歸的實現:

  1. 對每個節點構建下層連接:構建好左孩子到右孩子的連接;右孩子到next節點左孩子的連接。

  2. 遞歸構建左孩子、右孩子的下層連接。

這種情況下,與深度優先遍歷就很相似了。

所以說,這道題的TAG有深度優先遍歷,也是沒有問題的。只不過,深度優先可都是遞歸啊…就不是常量了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章