题目
给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。
例如,从根到叶子节点路径 1->2->3 代表数字 123。
计算从根到叶子节点生成的所有数字之和。
说明: 叶子节点是指没有子节点的节点。
示例:
思路
看一眼题目,第一印象:肯定要遍历二叉树,我选择前序遍历。
- 理解题目:找出根结点到叶子结点的所有路径上数字相加之和——>简称路径和,注意,这里不是简单的把每个结点上的数字相加,而是顺着根结点,到叶子结点,所连成的一个整数,我们求解过程中应注意数字所处在哪一位(百位/十位/个位),从而进行变换。
- 采取的算法:递归。
结束条件:
- 当root==null,说明无结点可走,return;
- 当root.left==null && root.right ==null,说明当前结点为叶子结点,应当将对该路径求和的结果累加起来。
递归内容:
- 若root.left !=null,则可以遍历左结点
- 若root.right!=null,则可以遍历右结点
- 细节/难点:如何计算每条路径数字之和
public class SumRootToLeafNumbers {
int sum;
public int sumNumbers(TreeNode root) {
if (root == null) {
return 0;
}
preOrder(root, root.val);
return sum;
}
public void preOrder(TreeNode root, int tempSum) {
if (root == null) {
return;
}
if (root.left == null && root.right == null) {
sum += tempSum;
}
if (root.left != null) {
preOrder(root.left, tempSum * 10 + root.left.val);
}
if (root.right != null) {
preOrder(root.right, tempSum * 10 + root.right.val);
}
}
}
做题反思
这道题对于只刷过三道树的题目的小白来说(我),真的难呀,我太菜了,绕半天,写了很长的代码,结果有什么用呢?思维不严谨,逻辑稀里糊涂的,失败失败。
目标:刷50道树的题!
(等我刷完数组和字符串哒,先往后排一排)
选择现阶段适合自己的,或者稍有难度的训练自己即可,太难了,反而心态都不好。
等时机成熟了,自己回头来看的时候,就会发现这些真的是好简单啊~
加油!冲冲冲
end.