タイトル:バイナリーツリーとなっているノードを考えると、先行順走査順とリターンの次のノードを見つけます。ツリー内のノードは、左と右の子ノードだけでなく、親ノードが指すポインタが含まれている含まれていることに注意してください。
分析:
行きがけの特徴によれば、ノードの次を見つけるためには、3例以上の何物でもありません:
右のサブツリーを持って、そしてちょうど次のトラバーサルとしてそれを右の子を入れ、1(見ていません)ノードは、それが葉ノードに遭遇するまで、左サブツリー(もしあれば)に沿ったノードは、定め次いでリーフノードが次のノードを探している;
2、権利サブツリーが存在しない、それはノードか否かを判断します;その親ノードの左の子である、それは次のノードを探している場合は、親ノードである
親ノードの子を残していない場合は次のノードのトラバーサルとして、バックアップまで、親ノードを入れて、3ノードを見つけることは親を持たないか、子ノードは、親ノードに任されています。
これら3例の組み合わせは、バイナリツリーノード内の任意のノードの隣に見出すことができます。
コードは以下の通りであります:
パブリック クラスFindNextNode { 公共BinaryTreeNode getNextNode(BinaryTreeNode•PNODE){ IF(•PNODE == nullの){ リターン ヌル; } // ノードが右のノードを持っている場合 IF(!pNode.getRightNode()= ヌル){ BinaryTreeNode tempNodeの、 = pNode.getRightNode (); ながら(!tempNode.getLeftNode()= NULL ){ tempNodeの、 = tempNode.getLeftNode(); } 戻りtempNodeのを,; } // 権利ノードが存在しない場合、親ノードの左の子であります IF(pNode.getFatherNode()== NULL ){ 戻り NULL ; } IF(pNode.getFatherNode()getLeftNode()==。•PNODE){ 返す(pNode.getFatherNodeを); } // 権利ノード、親が存在しない場合親ノードが存在しなくなるまで右の子ノード、親ノードを見上げてきた IF(pNode.getFatherNode()== nullの){ リターン ヌル; } IF(。pNode.getFatherNode()getRightNode()== •PNODE){ BinaryTreeNode tempNodeの、 = pNode.getFatherNode(); 一方(tempNode.getFatherNode()== NULL){ tempNodeの = tempNode.getFatherNode()。 } 戻りtempNodeのを、 } 戻り ヌル。 } }