1. 程式人生 > >Leetcode中級 每個結點的右向指標C++

Leetcode中級 每個結點的右向指標C++

給定一個二叉樹

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);
            }
        }                
    }
};