开门看题:收集树上所有苹果的最少时间
题目分析
题意很好理解,从根节点出发,找到所有带苹果的节点,然后返回根节点,问最短路径是多长。
看图来说,这不就是典型的回溯法吗?!顺便想个更新路径长度的策略就ok了!
但是最棘手的也是以前没有遇到过的问题摆在眼前,这个树状图的形状是由二维数组给出的,而且还要将带苹果的节点对应上。。。
回溯法陷入了僵局,正向思维貌似走进了死胡同,来试试逆向思维。
我们从含有苹果的叶子节点出发,向上一直找到根节点,如图1,4–>1–>0,当在从节点5出发时,到达节点1就可以停止了,所以,我们要为已经走过的路径所经过的节点设置一个状态值:true,这样寻找路径5–>1(true),便停止。在遍历到节点2,路径2–>0。设置一个全局变量记录路径长度,搞定!
①因为要向上查找,所以要记录所有从孩子节点到父节点的连接边,可以对edges进行反转得到: int reverseEdges[] 。
②需要记录每个节点的状态,该节点是由已经被已走路径路过:boolean visited[]。
③遍历每个节点,当该节点带苹果时,开始向上寻找路径,直到找到根节点,同时记录路径长度(因为原题是一来一回,所以最后的路径长度要*2)。