TAG
層序遍歷 - 常量空間,通過next指針
二叉樹
方法
看到題,想了一下,得用層序遍歷!
做法是:
用兩個vector,第一個vector用來依次存當前層的父節點,另一個vector用來依次存下一層的孩子節點。
初始時將root節點放入第一個vector,然後只要第一個vector不空,則循環:
對第一個vector中每個節點,把非空孩子節點依次放入第二個vector中;
放完後,連接第二個vector中的節點,很簡單地連接。
最後交換vector1和vector2(爲下次循環準備),開始下次循環。
然而,卻要求用常量空間!也就是不能用上述方法…
然後我就懵了。於是我看了DISCUZZ,結果看了一眼代碼,沒看細緻就覺得我懂了…
這是什麼原因呢?自己給自己設限了嗎?
我們可以用next指針來輔助做層序遍歷啊!!
每次取每層的第一個節點,用來開始本層的訪問以及下層的進入。
每層的訪問,設一個訪問指針,初始爲每層第一個節點,只要訪問指針非空,就把訪問指針的左孩子的next連上該指針的右孩子;如果訪問指針next非空,就把右孩子的next指針連上next節點的左孩子。然後將訪問指針設爲next指針。
進入下一層:去下層第一個節點等於本層第一個節點的左孩子。此時下層的next指針鏈已經由上層構建好了!
如果本層第一個節點爲空,或者本層第一個節點無左孩子(此時無需構建下層,而本層已經構建完成),那麼退出循環。
總結來說,就是用上層構建好下層,通過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;
}
}
};
後記
不明白我的代碼爲什麼這麼慢呢… 看了下他們確切的實現,也是如此啊..
另外,使用此方法遞歸的實現:
對每個節點構建下層連接:構建好左孩子到右孩子的連接;右孩子到next節點左孩子的連接。
遞歸構建左孩子、右孩子的下層連接。
這種情況下,與深度優先遍歷就很相似了。
所以說,這道題的TAG有深度優先遍歷,也是沒有問題的。只不過,深度優先可都是遞歸啊…就不是常量了。