Leetcode中級 每個結點的右向指標C++
阿新 • • 發佈:2019-01-01
給定一個二叉樹
struct TreeLinkNode {
TreeLinkNode *left;
TreeLinkNode *right;
TreeLinkNode *next;
}
填充它的每個 next 指標,讓這個指標指向其下一個右側節點。如果找不到下一個右側節點,則將 next 指標設定為 NULL。
初始狀態下,所有 next 指標都被設定為 NULL。
說明:
你只能使用額外常數空間。
使用遞迴解題也符合要求,本題中遞迴程式佔用的棧空間不算做額外的空間複雜度。
你可以假設它是一個完美二叉樹(即所有葉子節點都在同一層,每個父節點都有兩個子節點)。
示例:
給定完美二叉樹,
1
/ \
2 3
/ \ / \
4 5 6 7
呼叫你的函式後,該完美二叉樹變為:
1 -> NULL
/ \
2 -> 3 -> NULL
/ \ / \
4->5->6->7 -> NULL
思路:分三種情況:1.當前結點為左子節點,那麼它的next結點為其父節點的右子節點;2.當前結點為右子節點,那麼它的next結點為其父節點的next結點的左子節點;3.如果父節點不存在next結點,那麼當前結點的next結點為NULL。然後遞迴知道當前結點為NULL
class Solution { public: void connect(TreeLinkNode *root) { if(root == NULL) return ; root->next = NULL;//根結點的next結點肯定為NULL helper(root->left,root,NULL); helper(root->right,root,NULL); } void helper(TreeLinkNode* current,TreeLinkNode* parent,TreeLinkNode* pnext) //三個引數,當前結點,當前結點的父節點,當前結點的父節點的next結點 { if(current == NULL) return ; if(current == parent->left) //第一種情況 { current->next = parent->right; helper(current->left,current,parent->right); helper(current->right,current,parent->right); }else if(current == parent->right) { if(pnext == NULL) //第三種情況 { current->next = NULL; helper(current->left,current,NULL); helper(current->right,current,NULL); }else //第二種情況 { current->next = pnext->left; helper(current->left,current,pnext->left); helper(current->right,current,pnext->left); } } } };