一、与前两个打家劫舍I和打家劫舍II的区别(主要区别在怎么偷家)
1、力扣198.打家劫舍I:线性数组
2、力扣213.打家劫舍II:环形
3、力扣337.打家劫舍III:树
二、思考过程
1、因为是树,所以要考虑遍历顺序。所以要考虑递归
2、因为递归的时候,要先知道左右孩子的状态,返回给父节点,才能判断父节点的状态。所以考虑后续遍历
3、因为从下往上,左右孩子的状态会影响父节点的状态,状态从叶子节点一直移到根节点。所以考虑动态规划
所以,本题要考虑递归、动态规划、树这三个部分
那么,就要考虑"递归三部曲"、"动规五部曲"、"树的遍历顺序"这几个关键问题
三、关键性问题
1、dp数组的含义:在dp数组里定义两个元素,数组下标为"0"表示"不偷"当前节点,数组下标为"1"表示"偷"当前节点。dp0表示"不偷"当前节点的"最大钱币数",dp1表示"偷"当前节点的"最大钱币数"
(dp数组在本题有两个,一个是左孩子的dp数组:leftdp,一个是右孩子的dp数组:rightdp。)

2、递归的终止条件
如果在后序遍历的时候,遍历到了叶子节点的左右孩子,也就是空节点,就是终止条件。
假设此时遍历到叶子节点的左孩子,就返回vector<int>{0,0},表示的意思是不偷叶子节点的左孩子的最大钱币数为0,偷叶子节点的左孩子的最大钱币数为0

3、递推关系
i)不偷当前节点(数组下标为0):
当前节点的最大钱币数为dp0 = 左孩子不偷或偷的最大钱币数 + 右孩子不偷或偷的最大钱币数
(也就是dp0 = max(leftdp0,leftdp1) + max(rightdp0,rightdp1))
ii)偷当前节点(数组下标为1):
当前节点的最大钱币数为dp1 = 当前节点的钱币数 + 左孩子不偷的最大钱币数 + 右孩子不偷的最大钱币数 (因为相邻节点不能同时偷,所以要这样设置)
(也就是dp1 = cur->val + leftdp0 + rightdp0)
【下图以力扣上的题目的示例1作推理,】
