8つの勝利オファーは、対応するleetcodeのタイトルを探してきた質問は、その後、直接ブラシにインターネットオフの牛を見つけられませんでした。
件名の説明:
そして、前記ノード(PNODE)の与えられたバイナリツリーは、先行順走査順序とリターンに次のノードを見つけてください。ツリー内のノードは、左と右の子ノードだけでなく、親ノードが指すポインタが含まれている含まれていることに注意してください。
分析
私は左のサブツリーをコントロールしていない、つまり、問題を解決するための最初のアイデアを見ました。順トラバーサルでは、左の部分木の前に訪問したので、次のノードので、2つだけの可能性。
まず、右のサブツリーに
第二に、親ノードの一部
異なる状況とは:
まず、右部分木に
良く言っただけで、右の子ノードは、次のノードは、右の子がある場合。右部分木が木である場合しかし、その後、私たちは木の最も左右の子ノードを見ています。
TreeLinkNode * point=pNode->right;
while(point->left!=NULL)
{
point=point->left;
}
return point;
第二に、親ノード上で
右部分木はその後2例、空の場合。
(1)PNODEは、左の子ノードの親ノードであることがちょうどいいです、訪問されるべき次のラインで直接バック父ノードの父ノードである
、(2)PNODEは、その次の領域ここでノードを示す、右の子の親ノードでありますまた、少なくとも、親ノードの親ノードに。
私は私が解決再帰を使用して考えています、遠方の第二の場合には周りを開始しました。PNODEの父は、右の子ノードである場合には、PNODE = pNode->次の;彼の父は、ツリーの右の子ノードを切断しながら。これは、サブ問題を構築し、問題が次のノードにアクセスするための問題を探して、指定されたノードの父の後に変換されます。
if(pNode->right==NULL)
{
if(pNode->next==NULL||pNode==pNode->next->left)
return pNode->next;
else{
pNode->next->right=NULL;
return GetNext(pNode->next);
}
}
アクセス対象のノードに次のノードポインタを探して、全体的なアイデアについて少しは右のサブツリーを遮断するので、父へのポインタ言って、その後、新しいツリー。実際に、私は個人的に非常に賢い感じ。
しかし、まだ簡単な質問を複雑にしていますが、満足のいく状況PNODEは、(1)次のpNode->を返し見つけるまで、実際に見て、父への直接のラインを持っています。
if(pNode->right==NULL)
{
while(pNode->next!=NULL&&pNode!=pNode->next->left)
pNode=pNode->next;
return pNode->next;
}
最後に全体のコードについて入れています:
/*
struct TreeLinkNode {
int val;
struct TreeLinkNode *left;
struct TreeLinkNode *right;
struct TreeLinkNode *next;
TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
}
};
*/
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if(pNode==NULL)
return NULL;
if(pNode->right==NULL)
{
while(pNode->next!=NULL&&pNode!=pNode->next->left)
pNode=pNode->next;
return pNode->next;
}
TreeLinkNode * point=pNode->right;
while(point->left!=NULL)
{
point=point->left;
}
return point;
}
};