leetcode129 求根节点到叶节点数字之和

174 阅读1分钟

给你一个二叉树的根节点 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;