ブルーブリッジカップDFSルートからリーフノードまでの数の合計を求めます(中)

問題の説明

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

 

おすすめ

転載: blog.csdn.net/qq_40185047/article/details/114500606