501バイナリ検索ツリーのモードを探します
イージー
重複して二分探索木(BST)を考えると、すべて見つける モード(複数可)を 指定したBSTで(最も頻繁要素を生じました)。
次のようにBSTが定義されていると想定します。
- ノードの左サブツリーのみ未満またはノードのキーと同じキーを持つノードが含まれています。
- ノードの右サブツリーを超えるまたはノードのキーと同じキーを持つ唯一のノードを含みます。
- 左と右のサブツリーどちらも二分探索木でなければなりません。
たとえば、次のように
考えるとBST [1,null,2,2]
、
1 \ 2 / 2
リターン [2]
。
注:ツリーは複数のモードを持っている場合は、任意の順序でそれらを返すことができます。
フォローアップ:あなたは余分なスペースを使用せずにそれを行うだろうか?(再帰に起因して発生し、暗黙のスタック空間はカウントしないと仮定)。
パッケージleetcode.easy。 / ** *バイナリツリーノードの定義。パブリッククラスのTreeNode {int型のval; TreeNode *左; TreeNodeの右; ツリーノード(INT X){ヴァル= X。}} * / パブリッククラスFindModeInBinarySearchTree { プライベート静的ボイドprint_arr(INT [] NUMS){ {(NUMS INT NUM)用 System.out.print(NUM + "「); } System.out.println(); } java.util.Map <整数、整数>マップ。 int型の最大値= 0; 公共のint [] FINDMODE(ツリーノードのルート){ this.map =新しいjava.util.HashMapを<>(); INORDER(ルート)。 java.util.Listに<整数>リスト=新しいjava.util.LinkedList <>(); 用(INTキー:map.keySet()){ もし(map.get(キー)==最大){ list.add(キー); } } INT [] NUM =新しいINT [はlist.size()]。 以下のために(; I <はlist.size(); INT iが0 = I ++){ NUM [I] = list.get(I)。 } NUMを返します。 } 公共のボイドINORDER(TreeNodeの根){ IF(ルート== NULL){ リターン; } map.put(root.val、map.getOrDefault(root.val、0)+ 1)。 IF(map.get(root.val)> MAX){ 最大= map.get(root.val)。 } INORDER(root.left)。 INORDER(root.right)。 } @ org.junit.Test 公共ボイド試験(){ ツリーノードTN11 =新しいツリーノード(1)。 ツリーノードTN22 =新しいツリーノード(2)。 ツリーノードTN33 =新しいツリーノード(2)。 tn11.left = NULL; tn11.right = TN22。 tn22.left = TN33。 tn22.right = NULL; tn33.left = NULL; tn33.right = NULL; print_arr(FINDMODE(TN11))。 } }