【题目】
【分析】 虽然写着是简单题,但是我觉得这题不简单。
我们现在会求有没有从根节点到叶子节点的路径,路径上节点和等于给定数。路径的开头和结尾都给限制死了。 如果题目是:求有几条从根节点到叶子节点的路径,路径上节点和等于给定数。 根据前面的题,很容易写出代码:
int sum = 0; count(root,sum){ if(root == null ) return; if(root为叶子节点 ){ if(vale == sum ){ sum++; } return ; } count(root.left, sum -value); count(root.right, sum - value); }
现在结尾不一定是叶子结点了。所以递归的出口只留下一个即可,就是遍历到空位置。所以,应当把红色部分去掉。
int sum = 0; count(root, sum){ if(root == null) return; if(value == sum) sum++; //不返回,因为节点的值可能是正的可能是负的,所以不代表后面没有了。 count(root.left, sum-value); count(root.right, sum-value); }
这样,就可以求出从根节点开始的满足条件的路径数。 还有一个限制, 就是不一定从根开始。这样的话,就还是需要遍历一遍数,从所有节点都开始找找。
综上,一共需要两层的遍历。外层遍历是遍历一遍树,内层是看看以每个节点为根的树有多少条路径。
【代码】
【结果】
|