求根叶数字总和

阳光穿透心脏的1/2处 2021-09-26 15:08 343阅读 0赞

问题描述
给定一个只包含 0-9 数字的二叉树,每个根到叶的路径可以代表一个数字。
例如,从根到叶路径 1->2->3则代表数字 123。
查找所有根到叶数字的总和。
例如,

1
/ \
2 3
根到叶子路径 1->2 表示数字 12。
根到叶子路径 1->3 表示数字 13。
返回总和 = 12 + 13 = 25。

实现思路:
这是一个深度优先遍历,我想使用栈来实现。
1.使用三个栈,分别存放节点,路径和,该节点是否有两个孩子
2.遍历这颗树,若为叶子节点,则计算该叶子节点的数字并加到sum。
代码如下:

  1. class Solution {
  2. public int sumNumbers(TreeNode root) {
  3. Stack<TreeNode> stackTree = new Stack<TreeNode>();// 存放节点
  4. Stack<Integer> num = new Stack<Integer>();// 存放数据
  5. Stack<Boolean> hasTwo = new Stack<Boolean>();// 存放数据
  6. TreeNode p = root;
  7. int sum = 0;
  8. while (p != null) {
  9. if (p.right == null && p.left == null) {
  10. //为叶子节点
  11. if (num.isEmpty()) {
  12. //数字栈为空,则节点的数据即为结果
  13. sum += p.val;
  14. break;
  15. } else {
  16. //否则根据数据栈顶元素来计算结果
  17. sum = sum + num.peek() * 10 + p.val;
  18. //将只有一个孩子的结点出栈全部
  19. while (!hasTwo.isEmpty() && hasTwo.peek() == false) {
  20. stackTree.pop();
  21. num.pop();
  22. hasTwo.pop();
  23. }
  24. //栈空则直接跳出
  25. if (hasTwo.isEmpty()) {
  26. break;
  27. } else {
  28. //否则,p指向节点栈顶元素的右孩子
  29. p = stackTree.peek().right;
  30. hasTwo.pop();
  31. hasTwo.push(false);//并修改标识栈顶为false
  32. }
  33. }
  34. } else {
  35. stackTree.push(p);//节点有孩子则入栈
  36. //数据栈入栈
  37. if (num.isEmpty()) {
  38. num.push(p.val);
  39. } else {
  40. num.push(num.peek() * 10 + p.val);
  41. }
  42. //两个孩子则标志栈入true,否则为false
  43. if (p.right != null && p.left != null) {
  44. hasTwo.push(true);
  45. p = p.left;//有两个孩子先访问左孩子
  46. } else {
  47. hasTwo.push(false);
  48. if (p.left != null) {
  49. p = p.left;访问左孩子
  50. } else {
  51. p = p.right;//访问右孩子
  52. }
  53. }
  54. }
  55. if (stackTree.isEmpty()) {
  56. break;//栈空则结束
  57. }
  58. }
  59. return sum;
  60. }
  61. }

发表评论

表情:
评论列表 (有 0 条评论,343人围观)

还没有评论,来说两句吧...

相关阅读

    相关 数字

    数字根 一个正整数的数字根式通过计算该整数的各位和产生的。 如果一个整数的各位和为一位整数,那么这个数字就是该整数的数字根。 如果该整

    相关 C语言 数字乘积

    任务描述 从终端输入正整数,求该整数的数字乘积根。 功能要求 ①本程序要求可以连续求得多个整数的数字乘积根,直到用户输入数字0时,退出程序。 ②在主函数中输入正