问题描述
给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。
例如,从根到叶子节点路径 1->2->3 代表数字 123。
计算从根到叶子节点生成的所有数字之和。
说明: 叶子节点是指没有子节点的节点。
示例 1:
输入: [1,2,3]
1
/ \
2 3
输出: 25
解释:
从根到叶子节点路径 1->2 代表数字 12.
从根到叶子节点路径 1->3 代表数字 13.
因此,数字总和 = 12 + 13 = 25.
示例 2:
输入: [4,9,0,5,1]
4
/ \
9 0
/ \
5 1
输出: 1026
解释:
从根到叶子节点路径 4->9->5 代表数字 495.
从根到叶子节点路径 4->9->1 代表数字 491.
从根到叶子节点路径 4->0 代表数字 40.
因此,数字总和 = 495 + 491 + 40 = 1026.
参考代码
import java.util.Stack;
public class Main {
public static void main(String[] args) {
int[][]aa = {
{0,1,1,0,0},
{1,0,0,1,1},
{1,0,0,0,0},
{0,1,0,0,0},
{0,1,0,0,0},
};
int[] nodes = {4,9,0,5,1};
Stack<Integer> sta = new Stack<Integer>();
boolean [] check = new boolean[nodes.length];
int sum = 0;//求和
sta.push(0);//加入第一个位置定义4为起始点
check[0] = true;//标记节点4被访问过
boolean hasNext = false;//判断在撤回的时候的值有没有下一个数
while (!sta.isEmpty()) {//判断栈非空
int index = sta.peek();//弹出不删除
boolean flag = true;//开关
for (int i = 0; i < check.length; i++) {
if (!check[i]&&aa[index][i]==1) {
sta.push(i);
check[i] = true;//标记被访问过
flag = false;//改变开关状态
hasNext = true;
break;//跳出
}
}
if (flag) {
if (hasNext) {//这条线路到达尽头sum值加上叶子节点数字值
int temp = 0;
for (int i = 0; i < sta.size(); i++) {
temp = temp*10+nodes[sta.get(i)];
}
sum+=temp;
System.out.println(sta);
}
hasNext = false;
sta.pop();
}
}
System.out.println(sum);
}
}