【課題】先行順走査順序とリターンの次のノードを見つけ、二分木ノードを考えます。ツリー内のノードは、左と右の子ノードだけでなく、親ノードが指すポインタが含まれている含まれていることに注意してください。
それはあまりにも素晴らしいです、次のと呼ばれる、この質問は、親ポインタは、親と呼ばれていない非常に欺瞞的である[思考]が、問題ではありません、次のノードトラバーサル順序は、次の2つの状況に分けられます。
ケース1:ノードの右部分木の一番左のノードが次のノードであるノードの右部分木があり、我々はそれを見つけるためにトラバース!
ケース2:ノードの右部分木が存在しない、それが2例に分けることができます
1.ノードが正しいノードである場合、あなたはそれはノードが左のノードで検出されるまで停止し、上向きにトラバースする必要がありますする必要があるが、親ノードが次のノードである左。
2.ノードが左ノード、次のノードの親ノードである場合!
/ * 構造体TreeLinkNode { int型のval; 構造体TreeLinkNode *左; 右のstruct TreeLinkNode *; 次のstruct TreeLinkNode *; TreeLinkNode(int型X):ヴァル(x)は、左(NULL)、右(NULL)、次の(NULL){ } }。 * / クラスソリューション{ パブリック: TreeLinkNode * GetNextの(TreeLinkNode * PNODE) { 場合(PNODE == nullptr) 戻りnullptr。 TreeLinkNode * pNext = nullptr; もし(pNode->右= nullptr!) // 情况一:有右子树 { TreeLinkNodePright = pNode- *> 右; しばらく(!PRight->左= nullptr A) Pright = pRight->左; // 左端の右部分木のノードを探す pNext = Pright; } 他の IF(pNode->次= nullptr A! ) // ケース2:右の部分木が空 { TreeLinkNode * = pCurrent •PNODE; TreeLinkNode * = pNode- pParent> 次に、 一方(pParent = nullptr A && pCurrent pParent- ==>!右) // 2.1空右サブツリーノードが右のノードである、あなたは親ノードノードの左ノードまで見つける必要がある //次のノードへのノードの親ノードを { pCurrent = pParent; pParent = pParent-> 次; } // 2.2は空であり、右の部分木が左ノードである親ノードが次のノードである pNext = pParent; } 戻りpNextを; } }。