@@ -19,74 +19,27 @@ const TreeNode = require("../工具/二叉树");
1919 * @param {TreeNode } root
2020 * @return {number }
2121 */
22+ let memo = new WeakMap ( )
2223let rob = function ( root ) {
23- if ( ! root ) return 0 ;
24-
25- // 先求出树的层级 以及每层对应的所有节点
26- const { maxLevel, levelNodesMap } = makeLevelNodesMap ( root ) ;
27-
28- let getLevelValue = ( level ) => {
29- const nodes = levelNodesMap . get ( level ) ;
30- if ( ! nodes ) {
31- return 0 ;
32- }
33- let value = 0 ;
34- for ( let i = 0 ; i < nodes . length ; i ++ ) {
35- value += nodes [ i ] . val ;
36- }
37- return value ;
38- } ;
39-
40- // 接下来开始进入打劫时间
41- let dp = [ ] ;
42- for ( let i = maxLevel ; i >= 0 ; i -- ) {
43- let max = 0 ;
44- // 每次需要跳过一个层级,不能打劫相邻的房子。
45- for ( j = i ; j <= maxLevel ; j ++ ) {
46- // 当前层级的价值加上跳一层后为起点的打劫的最大价值
47- max = Math . max ( max , getLevelValue ( j ) + ( dp [ j + 2 ] || 0 ) ) ;
48- }
49- dp [ i ] = max ;
24+ if ( ! root ) {
25+ return 0 ;
5026 }
5127
52- return dp [ 0 ] ;
53- } ;
54-
55- function makeLevelNodesMap ( root ) {
56- let queue = [ root ] ;
57- // 每一层级的节点记录下来
58- let levelNodesMap = new Map ( ) ;
59- let maxLevel = 0 ;
60- while ( queue . length ) {
61- // 缓存当前层级的节点长度
62- let levelLen = queue . length ;
63- let levelNodes = [ ] ;
64- for ( let i = 0 ; i < levelLen ; i ++ ) {
65- let node = queue [ i ] ;
66- levelNodes . push ( node ) ;
67-
68- // 这里是下一层级了 先放入队列中
69- if ( node . left ) {
70- queue . push ( node . left ) ;
71- }
72- if ( node . right ) {
73- queue . push ( node . right ) ;
74- }
75- }
76-
77- // 本层处理完毕 移除出数组
78- for ( let i = 0 ; i < levelLen ; i ++ ) {
79- queue . shift ( ) ;
80- }
81-
82- levelNodesMap . set ( maxLevel , levelNodes ) ;
83- if ( queue . length ) {
84- maxLevel ++ ;
85- }
28+ let memorized = memo . get ( root )
29+ if ( memorized ) {
30+ return memorized
8631 }
8732
88- return { maxLevel, levelNodesMap } ;
89- }
33+ let notRob = rob ( root . left ) + rob ( root . right ) ;
34+ let robNow =
35+ ( root . val || 0 ) +
36+ ( root . left ? rob ( root . left . left ) + rob ( root . left . right ) : 0 ) +
37+ ( root . right ? rob ( root . right . left ) + rob ( root . right . right ) : 0 ) ;
38+
39+ let max = Math . max ( notRob , robNow ) ;
40+ memo . set ( root , max )
41+ return max ;
42+ } ;
9043
9144// 这种情况是不对的 应该计算出7
9245let tree1 = new TreeNode ( 2 ) ;
0 commit comments