問題の説明
二分木が与えられると、その各ノードは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);
}
}