トピック:
通りや家を奪った後、最終ラップの完了後、彼は泥棒が新しい分野を盗むことができます発見しました。領域は、我々が呼んで唯一の入り口、持っている「ルートを。」「ルート」、そして唯一の家それに関連する「親」の家に加えて。いくつかの偵察後、賢い泥棒は「この場所は、すべての家がバイナリツリーに似て配置されている。」ことを実現しました 両院が直接接続されている場合は、同じ夜、家のアラームを奪いました。
アラームを触れることなく計算し、泥棒は、夜の最大量を盗むことができます。
例1:
入力:[3,2,3、ヌル、3、NULL、1]
3
/ \
2 3
\ \
3 1
出力:7
説明:夜を盗む盗人が最大量= 3 + 3 + 1 = 7であることができる
(実施例2)
入力:[3,4,5,1,3、ヌル、1]
3
/ \
4
\ \ /
1 3 1
出力:9
説明:夜盗む盗人= 4 + 5 = 9最大量とすることができます。
問題解決:
/ ** *バイナリツリーノード定義のA。 *パブリッククラスツリーノード{ * INTヴァル; *ツリーノードは、左; *ツリーノード右; *ツリーノード(INT X){X =ヴァル;} *} * / クラスソリューション{ 公共 のint ロブ(TreeNodeのルート){ / * あなたは、私が今まで見た中で最も賢い泥棒だ * / / * //再帰的思考(いないの深い再帰関数本体、ちょうど再帰関数の機能ということを知っている、と再帰のうち境界条件を見つけるために) //アイデア: 強盗強盗+左右のサブツリー+奪う左と右のサブツリーの右の子ノードの子の左ノードのノードのために盗むことができます//最大量 //そのノード強盗強盗の左側のサブツリーノードを+最大値の右サブツリー 1005ms理由を行う際に多くの繰り返し計算が行われている//が使用されているが、動的計画法を用いて解くことができる (ルート== NULL)戻り0の場合 。 int型のVal = 0。 IF(!= nullのroot.left)+ =ヴァルロブ(root.left.left)+ロブ(root.left.right); IF(!= nullのroot.right)+ =ヴァルロブ(root.right.left)ロブ+(root.right.right); ; Math.max(ロブ(root.left)+ロブ(root.right)、ヴァル+のroot.val)を返す * / // 動的計画 // アイデアは: // 定義配列RES、長さ2、RES [0]ノードは、得られる最大値を取得しないことを示し、RES [1]ノード強盗最大得られることを示し // rがために、ルートノードである:方法ヘルパー(登録商標)を意味しますツリーは、ルートノードは、強盗強盗利用可能な最大ルート戻らない // ときに2msの実行 INT [] RES = ヘルパー(ルート); 戻り Math.max([1 RES [0]、RESを;]) } 公共 INT []ヘルパー(ツリーノードR&LT){ IF(R&LT ==NULL)を返す 新しい新しい INT [2]; // 境界条件を、rは外、nullである INT [] =左ヘルパー(r.left); // r.left算出強盗ルートをルートとするツリーの(R .LEFT)はなく、ルートノードの最大量を得るために、強盗。 // 左[0]最大量r.lrftが利用できなかったつかむために、左の[1]、右[r.left強盗に利用可能な最大量と比較】分析同様に 値int [] =右ヘルパー(r.rightを); int型 = [] RESを新しい新しい INT 2 [ ]; RES [ 0] = Math.max(左の[0]、左の[1])+ Math.max (右の[0]、右[1]); // 計算しない奪う利用可能な最大電流量(その左と右の部分木を容易につかむことができる)の根 RES [1] + = r.val左[0] +右[0]; // 最大量の利用可能な強盗ルート計算(ここでは、ルートノードの左及び右サブツリーを奪われていない)場合は リターン解像度; } }