LeetCode_501。バイナリ検索ツリーのモードを探します

 

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))。
	}
}

 

おすすめ

転載: www.cnblogs.com/denggelin/p/12128022.html