一个小算法,分享一下思路:

描述:

写一个程序创建一棵二叉树,并按照一定规则,输出二叉树根节点到叶子节点的路径。

规则如下:
1、从最顶端的根结点,到最下面的叶子节点,计算路径通过的所有节点的和,如果与设置的某一值的相同,那么输出这条路径上的所有节点。

2、从根节点遍历树时,请请按照左到右遍历,即优先访问左子树的节点。


二叉树创建规则:从上到下一层一层的,按照从左到右的顺序进行构造

输入"10,5,12,4,7"值,构造的树如下:

1)10


2)10
/
5

3)10
/\
512

4)10
/\
512
/
4

5)10
/\
512
/\
47

针对上面的二叉树,如果当前我们设置的“路径和”为19,那么输出结果为:

10,5,4

如果有多个路径,按到左到右的顺序遍历生成的结果每行显示一个显示。例如如果当前我们设置的“路径和”为22,那么输出结果为:

10,5,7

10,12

如果没有找到路径和为设置的值的路径,输出error。


输入:

输入整数N---路径和

一行字符串,多个正整数,之间用","隔开


输出:

满足条件的二叉树路径

输入:

22
10,5,12,4,7

样例输出:

10,5,7
10,12

实现代码:

/*
*Created on 2016年8月17日
*Copyright 2016 Yong Cai Limited crop. All Rights Reserved
*
*728**0@qq.com
*/


import java.util.Scanner;

public class Main {

public static int counter = 0;

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);

int N = Integer.valueOf(sc.nextLine());
String line = sc.nextLine();

compute(N, line);
}

public static void compute(int N, String line){

String[] arr = line.split(",");
int len = arr.length;

//从index=1开始存数据
Node[] nodeArr = new Node[len + 1];

for(int i = 0; i < len; i++){
int val = Integer.valueOf(arr[i]);
nodeArr[i + 1] = new Node(val);
}

//构建二叉树
Node root = nodeArr[1];
for(int i = 1; i < len + 1; i++){
if(i * 2 < len + 1){
nodeArr[i].left = nodeArr[2 * i];
}

if(i * 2 + 1 < len + 1){
nodeArr[i].right = nodeArr[2 * i + 1];
}
}

//printTree(root);

printPaths(root, len, N);
}


public static void printTree(Node root){
if(root == null){
return;
}

System.out.println(root.val);

if(root.left != null){
printTree(root.left);
}

if(root.right != null){
printTree(root.right);
}
}

public static void printPaths(Node root, int n, int N) {
int[] path = new int[n];
printPaths(root, path, 0, N);

if(counter == 0){
System.out.println("error");
}

}


public static void printPaths(Node root, int[] path, int pathLen, int N) {
if (root == null) return;
path[pathLen++] = root.val;
if (root.left == null && root.right == null) {
printArray(path, pathLen, N);
}
else {
printPaths(root.left, path, pathLen, N);
printPaths(root.right, path, pathLen, N);
}
}

public static void printArray(int[] ints, int len, int N) {
int total = 0;
StringBuilder sb = new StringBuilder();

for (int i = 0; i < len; i++) {
sb.append(ints[i] + ",");
total += ints[i];
}

if(total == N){
System.out.println(sb.toString().substring(0, sb.toString().length() - 1));
counter++;
}
}


}

class Node{

public int val;
public Node left;
public Node right;

public Node(int val){
this.val = val;
}
}


 




更多相关文章

  1. ArcGIS JS API For JavaScript实现类台风运动路径与影响范围的显
  2. 蓝桥杯--第七届决赛:路径之谜

随机推荐

  1. Python机器学习·微教程
  2. Quora千赞回答,python新手应该避免哪些坑
  3. numba,让你的Python飞起来!
  4. 一文搞懂Python迭代器和生成器
  5. 数据科学:是时候该用seaborn画图了
  6. 什么是机器学习中类别数据的转换?
  7. 教你使用Python批量读写excel文件
  8. 看图涨知识,一百天搞定机器学习
  9. xlwings,让excel飞起来!
  10. 知识星球 | 说说我为什么要做『python数