计算左子树的
R
e
s
1
l
e
f
t
Res1_{left}
Res1left和
R
e
s
2
l
e
f
t
Res2_{left}
Res2left
计算右子树的
R
e
s
1
r
i
g
h
t
Res1_{right}
Res1right和
R
e
s
2
r
i
g
h
t
Res2_{right}
Res2right
下面开始计算本节点的
R
e
s
1
Res1
Res1和
R
e
s
2
Res2
Res2
R
e
s
1
=
m
a
x
(
R
.
v
a
l
+
R
e
s
2
l
e
f
t
+
R
e
s
2
r
i
g
h
t
,
R
e
s
1
l
e
f
t
+
R
e
s
1
r
i
g
h
t
)
Res1 = max(R.val + Res2_{left} + Res2_{right}, Res1_{left} + Res1_{right})
Res1=max(R.val+Res2left+Res2right,Res1left+Res1right)
R
e
s
2
=
R
e
s
1
l
e
f
t
+
R
e
s
1
r
i
g
h
t
Res2 = Res1_{left} + Res1_{right}
Res2=Res1left+Res1right
返回Res1和Res2
代码:
class Result{
public:int low_level;int high_level;Result(){
low_level =0;
high_level =0;}};
Result robBase(TreeNode* root){if(root ==NULL){returnResult();}
Result left =robBase(root->left);
Result right =robBase(root->right);int max_value =max(root->val + left.low_level + right.low_level, left.high_level + right.high_level);
Result res;
res.high_level = max_value;
res.low_level = left.high_level + right.high_level;return res;}introb(TreeNode* root){// int res = robBase(root, true);if(root ==NULL)return0;
Result res =robBase(root);return res.high_level;}