1.タイトル説明
/ * 二分探索木を考えると、その中の最初のk小さいノードを検索してください。 例えば、(5,3,7,2,4,6,8)と、第3の接続点に係る数値は、4要約です。 * /
2.アイデア
二分探索木を行きがけ、それがKの結果であります
3.非再帰
輸入 java.utilの。* ; パブリック クラスソリューション{ 静的ツリーノードKthNode(ツリーノードPROOT、int型K){ 戻りinorderNR(PROOT、k)を、 } パブリック 静的ツリーノードinorderNR(ツリーノードPROOT、int型K){ int型のカウント= 0 ; スタック <のTreeNode> S = 新しいスタック<> (); ツリーノードCURR = PROOT。 一方、(CURR!= NULL ||!s.empty()){ 一方(CURR!= NULL ){ s.push(CURR)。 CURR = curr.left。 } CURR = s.pop()。 カウント ++ ; もし(==カウント{k)を 破ります。 } CURR = curr.right。 } 戻りCURR。 } }
4.再帰
輸入 java.utilの。* ; パブリック クラスソリューション{ ツリーノードKthNode(ツリーノードPROOT、int型K){ 戻りinorderR(PROOT、k)を、 } 公共の int型のカウント= 0; // 注意不能是静态 公共のTreeNode inorderR(ツリーノードのルート、int型K){ 場合(!ルート= NULL ){ // 左 ツリーノードは=左inorderR(root.left、k)を、 もし(!左= ヌル){ リターンが左;} // 中 ++数えます。 もし(==カウントK){ 戻りルート;} // 右 ツリーノード右= inorderR(root.right、K)。 もし(!右= NULL){ 戻り右;} } 戻り ヌル。 } }