截止到目前我已经写了 600多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载 下载链接:https://pan.baidu.com/s/1hjwK0ZeRxYGB8lIkbKuQgQ 提取码:6666
这里我们先画个图来看一下
我们可以看到从根节点到当前节点这条路径的值就是父节点的值*2加上当前节点的值。我们定义一个全局的变量res,他就是所有从根节点到叶子节点表示数字的和。
我们可以通过前序遍历来解这道题,当遇到叶子节点的时候就把从根节点到当前叶子节点表示的数字加到res中。直接把二叉树的前序遍历方式修改一下即可。
int res = 0;
public int sumRootToLeaf(TreeNode root) {
dfs(root, 0);
return res;
}
public void dfs(TreeNode root, int parentPathSum) {
if (root == null)
return;
int sum = parentPathSum * 2 + root.val;
if (root.left == null && root.right == null) {
res += sum;
return;
}
dfs(root.left, sum);
dfs(root.right, sum);
}
时间复杂度:O(N),N是节点的个数,所有节点都要访问一遍 空间复杂度:O(H),H是树的最大高度,也是栈的深度
BFS解决 除了DFS,我们还可以使用BFS来解决,DFS就是深度优先搜索,BFS就是广度优先搜索,具体也可以看下373,数据结构-6,树。BFS就是一层一层的访问。这里需要使用两个队列:
- 一个存放节点
- 一个存放从根节点到当前节点这条路径表示的数字
如果访问到叶子节点的时候就把表示的数字加入到res中,最后返回res即可,我们来看下代码。
public int sumRootToLeaf(TreeNode root) {
int res = 0;
Queue<TreeNode> queueNode = new LinkedList<>();
Queue<Integer> queueParentSum = new LinkedList<>();
queueNode.add(root);
queueParentSum.add(0);
while (!queueNode.isEmpty()) {
TreeNode cur = queueNode.poll();
int parentSum = queueParentSum.poll();
int sum = parentSum * 2 + cur.val;
if (cur.left == null && cur.right == null) {
res += sum;
continue;
}
if (cur.left != null) {
queueNode.add(cur.left);
queueParentSum.add(sum);
}
if (cur.right != null) {
queueNode.add(cur.right);
queueParentSum.add(sum);
}
}
return res;
}
时间复杂度:O(N),N是节点的个数,所有节点都要访问一遍。 空间复杂度:O(N),这里使用了两个队列,因为队列中元素不停的进和出,最差情况下是满二叉树,到叶子节点的时候每个队列使用的空间是整颗树节点的一半(N/2)
|