面试题中的关于这个算法的有少,自己编写了一下。
思路就是利用递归算法,和二叉树的中序遍历思想。具体代码如下:
package com.bishi;
import java.util.ArrayList;
import java.util.List;
public class TreeAndTest {
//list 存储遍历到的节点
private List<Node> list = new ArrayList<Node>();
public void findPath(Node root,List<Node> list,int sum,int x){
if(root == null){
return;
}
sum+=root.value;
list.add(root);
//如果该结点为叶子结点,并且和相等则输出
if(sum == x && root.left == null && root.right == null ){
//打印路径
for(int i = 0; i < list.size();i++){
System.out.println("路径为:" + list.get(i).value);
}
System.out.println(" ");
}
if(root.left!=null){
findPath(root.left,list,sum,x);
}
if(root.right!=null){
findPath(root.right,list,sum,x);
}
//在回溯到父结点前需要减掉当前的值,并在当前的记录序列中移除该结点。这一步是必须要的,因为路径可能有多条,必须回溯到某一节点重新遍历
sum -= root.value;
list.remove(root);
}
public static void main(String[] args) {
int data[] = new int[]{5,3,7,4,1};
TreeAndTest test = new TreeAndTest();
Node tree = test.new Node(data[0]);
for(int i = 1;i<data.length;i++){
tree.insert(tree, data[i]);
}
test.findPath(tree, test.list, 0, 12);
}
/**
*
* 构造二叉树
*
*/
class Node {
int value;
Node left;
Node right;
Node(int data) // 实例化二叉树类
{
this.value = data;
left = null;
right = null;
}
//插入新节点
public void insert(Node root,int value){
if(value<root.value){
if(root.left==null){
Node node = new Node(value);
root.left = node;
}else{
insert(root.left,value);
}
}else{
if(root.right == null){
Node node = new Node(value);
root.right = node;
}else{
insert(root.right,value);
}
}
}
}
}