给你一个二叉树的根节点
root,树中每个节点都存放有一个0到9之间的数字。
思路
1.dfs 使用深度优先遍历方法,每递归到一个新结点就将上一层传入的sum乘以10+本节点的值,判断是否有左右孩子,如果有就继续递归,如果没有那么就添加到res中。
代码
public int sumNumbers(TreeNode root) {
backtrack(root,0);
return res;
}
private void backtrack(TreeNode node, int sum) {
if (node == null) return;
if (node.left == null && node.right == null) {
res += sum*10+node.val;
return;
}
backtrack(node.left,sum*10+node.val);
backtrack(node.right,sum*10+node.val);
}
2.bfs广度优先遍历,使用两个队列,一个储存node节点,一个储存节点累计值,遍历nodeQueue,当node没有左右孩子时就加入res中,否则就继续添加到队列中,并且也要计算节点累计值(num*10+child val)加入到队列中,直到队列没有节点值。
代码:
int res = 0;
Deque<TreeNode> nodeQueue = new LinkedList<>();
Deque<Integer> numQueue = new LinkedList<>();
nodeQueue.addLast(root);
numQueue.addLast(root.val);
while (!nodeQueue.isEmpty()){
TreeNode treeNode = nodeQueue.removeFirst();
int num = numQueue.removeFirst();
if (treeNode.left == null && treeNode.right == null){
res += num;
}else{
if (treeNode.left != null){
numQueue.addLast(num*10+treeNode.left.val);
nodeQueue.addLast(treeNode.left);
}
if (treeNode.right != null){
numQueue.addLast(num*10+treeNode.right.val);
nodeQueue.addLast(treeNode.right);
}
}
}
return res;