非常自然的推廣,如果去掉完全二叉樹的條件呢?因為這個條件不是關鍵,因此不會影響總體的思路,做法依然是每次找到一層的起點,然後一層一層的走。
如果是完全二叉樹的話,每層的起點就是上一層起點的左孩子,兄弟之間的連結也簡單,直接找對應父親的左右孩子即可。一般二叉樹時,起點應該是上一層第一個有孩子節點的左孩子,或者沒有左孩子時,是他的右孩子。為了能在孩子層中不斷連結,我們必須儲存當孩子層的前一個節點,噹噹前層找到一個節點有孩子,就接到這個pre節點後面,然後更新pre節點的指向。
class Solution {public: void connect(TreeLinkNode *root) { if(root == NULL) return; TreeLinkNode *beginNode = root, *leftNode, *pre; while(beginNode){ leftNode = beginNode; pre = NULL; beginNode = NULL; while(leftNode){ if(leftNode->left&&leftNode->right){ leftNode->left->next = leftNode->right; if(pre) pre->next = leftNode->left; if(!beginNode) beginNode = leftNode->left; pre = leftNode->right; }else if(leftNode->left){ if(pre) pre->next = leftNode->left; if(!beginNode) beginNode = leftNode->left; pre = leftNode->left; }else if(leftNode->right){ if(pre) pre->next = leftNode->right; if(!beginNode) beginNode = leftNode->right; pre = leftNode->right; } leftNode = leftNode->next; } } }};