题目描述:
认为二叉树的根到每个叶子结点的路径上的点是一个数,若该条路径有三个结点,则表示的数为根结点节点的值乘100加下一结点值乘10加叶子结点的值。该问题是想求所有路径构成数的和。
如上二叉树,其三条路径表示的数分别为:124,135,136则应返回395。
解决思路:
算法一:看到这种问题最初的想法,不考虑性能只考虑实现,上来二话不说、直接DFS,将所有路径都求出来存入list<list>中,然后再遍历路径列表得到结果。
(ps:别问这块为啥没代码......)
算法二:将所有路径都求出来这种做法真的很浪费空间,能否再此基础上优化一下?使用DFS + 回溯,只需要存储一条路经即可。
public void selution(TreeNode root, List<Integer> path,int[] sum) {
path.add(root.val);
if(root.left == null && root.right == null) {
sum[0] += getSum(path);
path.remove(path.size() - 1);//恢复现场
return;
}
if(root.left != null) selution(root.left, path, sum);
if(root.right != null) selution(root.right, path, sum);
path.remove(path.size() - 1);//恢复现场
}
public int getSum(List<Integer> path) {
int sum = 0;
for(int num : path) {
sum = sum * 10 + num;
}
return sum;
}
算法三:一条路径都不想存,想要在常数空间复杂度条件下完成。在递归的过程输人该该条路径之前结点的值temp,先更新temp值为temp * 10 + root.val。再判断当前结点是否为叶子结点,若是叶子结点则将temp加到和上即可,若非也叶子结点,则依照此法处理其左、右孩子即可。
该方法虽然没有现场恢复操作,但是还是属于回溯的,这是由于传入的temp是int型,基本数据类型,传入函数里面的变化并不会影响外面的temp值。
具体实现代码如下:
扫描二维码关注公众号,回复:
9811904 查看本文章
public void selution(TreeNode root, int temp, int[] sum) {
if(root == null){
return;
}
temp = temp * 10 + root.val;
if(root.left == null && root.right == null) {
sum[0] += temp;
return;
}
selution(root.left, temp, sum);
selution(root.right, temp, sum);
}
public int sumNumbers(TreeNode root) {
if(root == null){
return 0;
}
int[] sum = new int[1];
selution(root,0,sum);
return sum[0];
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sum-root-to-leaf-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。