对于一个由一位十进制整数构成的二叉树,如果深度不超过4,可以用一个三位十进制整数构成的数组表示,具体规则如下:
1、百位数表示树的层次L,1<=L<=4;十位数表示在该层次中的位置P,1<=P<=8;个位数表示数值V。
2、数组里,L一定是单增的,也就是说后一个数的L大于等于前一个数的L;
3、对于同一个L,P也是单增的,就是说在L不变的情况下,后一个数的P大于等于前一个数的P。
例如:[ 113, 215, 221 ]
3
/ \
5 1
现在要求这个树所有到叶子节点的路径和,对于例子中,路径和为 (3+5)+(3+1)=12
解决思路:
1. 树 存储(这里用采用数组,通过节点编号来建立亲子关系,如节点i的左节点为arr[2*i],右节点为arr[2*i+1])
2. 叶子节点判断
3. 叶子路径求和
附上代码:
作者网站: http://www.lazymore.com(click is a support)
package alibaba.interview;
import java.util.Scanner;
public class Solution1 {
public static void main(String[] args) {
int res = resolve();
System.out.println(res);
}
static int resolve() {
Scanner in = new Scanner(System.in);
int num = 0;
int[] arr = new int[16]; // 用数组存储树,丛1开始,4层最多15个节点
// 初始化树
for (int i = 0; i < arr.length; i++) {
arr[i] = -1;
}
// 获取输入
do {
num = Integer.parseInt(in.nextLine().trim());
if (num == 0) break;
int a = num / 100;
int b = num / 10 % 10;
int c = num % 10;
int pos = (int)(Math.pow(2, a - 1)) + b - 1;
arr[pos] = c;
} while (true);
// 找到叶节点,对路径求和
int sum = 0;
for (int i = 1; i < arr.length; i++) {
boolean isleaf = false;
if ((i >= 8 && arr[i] != -1) || (i < 8 && arr[i] != -1 && arr[2 * i] == -1 && arr[2 * i + 1] == -1)) {
isleaf = true;
}
int k = i;
if (isleaf) {
while (k >= 1) {
sum += arr[k];
k /= 2;
}
}
}
return sum;
}
}