题目:输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如 输入整数22和如下二元树
10
/ \
5 12
/ \
4 7
则打印出两条路径:10, 12和10, 5, 7。
算法很简单,只是需要用java构造一个tree
package test;
import java.util.ArrayList;
import java.util.List;
public class FindTreePath {
public void printPath(int match,List<Integer> path,int sum,MyTree tree){
List<Integer> currentPath=new ArrayList<Integer>();
currentPath.addAll(path);
currentPath.add(tree.getCurrentNode().getValue());
sum+=tree.getCurrentNode().getValue();
if(tree.isLeaf()){
if(sum==match)System.out.println(currentPath);//找到结果并打印
}else {
if(sum<=match){//当和小于等于match时继续找
if(tree.toLeftChild())printPath(match, currentPath, sum, tree);
if(tree.toRightChild())printPath(match, currentPath, sum, tree);
}
}
tree.toParent();
}
public static void main(String[] args) {
MyTree tree=new MyTree(10);
tree.addLeftChild(5);
tree.addRightChild(12);
tree.toLeftChild();
tree.addLeftChild(4);
tree.addRightChild(7);
tree.toRoot();
FindTreePath test=new FindTreePath();
test.printPath(22, new ArrayList<Integer>(), 0, tree);
}
}
package test;
/**
* @author Administrator
*
*/
public class MyTree {
private Node currentNode;
public MyTree(int val) {
Node node = new Node();
node.setValue(val);
currentNode = node;
}
public void addLeftChild(int val) {
Node node = new Node();
node.setValue(val);
node.setParent(currentNode);
currentNode.setLeftChild(node);
}
public void addRightChild(int val) {
Node node = new Node();
node.setValue(val);
node.setParent(currentNode);
currentNode.setRightChild(node);
}
public void toRoot() {
if (currentNode.getParent() != null) {
currentNode = currentNode.getParent();
toRoot();
}
}
public boolean toParent() {
if (currentNode.getParent() != null) {
currentNode = currentNode.getParent();
return true;
}
return false;
}
public boolean toRightChild() {
if (currentNode.getRightChild() != null) {
currentNode = currentNode.getRightChild();
return true;
}
return false;
}
public boolean isLeaf(){
return currentNode.getLeftChild()==null&¤tNode.getRightChild()==null;
}
public boolean toLeftChild() {
if (currentNode.getLeftChild() != null) {
currentNode = currentNode.getLeftChild();
return true;
}
return false;
}
public Node getCurrentNode() {
return currentNode;
}
}
package test;
public class Node {
private int value;
private Node parent;
private Node leftChild;
private Node rightChild;
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public Node getParent() {
return parent;
}
public void setParent(Node parent) {
this.parent = parent;
}
public Node getLeftChild() {
return leftChild;
}
public void setLeftChild(Node leftChild) {
this.leftChild = leftChild;
}
public Node getRightChild() {
return rightChild;
}
public void setRightChild(Node rightChild) {
this.rightChild = rightChild;
}
}
分享到:
相关推荐
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的空间聚类算法,它可以发现任意形状的聚类,而不需要预先设定聚类的数量。它通过检查数据点之间的邻近关系来确定聚类,对...
3. **构建树头表**:创建一个头表,其中每个项对应一个链表,链表包含所有包含该项的事务ID。例如,如果项集是{A, B, C},则头表会包含三个条目,分别是A、B和C,每个条目链接包含它们的事务ID。 4. **构建FPTree**...
FPtree算法的核心在于构建一个树形结构,树的节点代表数据集中的项,边表示项之间的关联关系。通过这种结构,算法可以直接从树中提取频繁模式,而无需像Apriori算法那样反复扫描数据库和生成候选集。 ##### 挖掘...
- **定义:** 频繁模式树(Frequent Pattern Tree,简称FP-Tree)是一个特殊的树结构,由一个根节点(值为null)、若干项前缀子树(作为子节点)以及一个频繁项头表组成。 - **项前缀子树:** 每个结点包含三个域:`...
kd树很基本的算法介绍和实现方法概括。全英文的文档。 Over the past six weeks, we've explored a wide array of STL container classes. You've seen the lin- ear vector and deque, along with the associative...
综上所述,fp-tree算法是数据挖掘中的一个强大工具,尤其在关联规则学习中表现出色,但需要根据具体问题选择合适的算法,并注意其适用性和潜在的局限性。在实际应用中,可能需要结合其他算法或优化策略来提高性能和...
项集是指一组项目的集合,交易数据库是指一个包含多个交易记录的数据库。频繁项集是指在交易数据库中频繁出现的项集。关联规则是指在交易数据库中发现的规律性关系,例如A=>B,表示A出现时B也出现的规律关系。支持度...
Python作为一种强大的编程语言,因其易读性与丰富的库支持,成为了实现FP-TREE算法的理想选择。在这个项目中,我们使用Python 3.2版本来实现这一算法,并且能可视化每一步的FP树,帮助用户更好地理解和分析过程。 ...
2. **构建FP-List**:对每一个频繁项,按照其在交易(事务)中出现的顺序,构建一个倒序链表,即FP-List。每个节点包含项、交易ID和指向下一个节点的指针。 3. **压缩FP-List**:接下来,根据FP-List构建FP-Tree。...
在提供的C++实现中,`test3.cpp`可能是一个包含测试用例的源代码文件,它可能包含了构建和测试FP-TREE算法的函数。而`data`文件可能是数据集,用于运行算法的输入。 在实际应用中,C++的FP-TREE算法实现可能会涉及...
该算法基于“频繁项集”的概念,即如果一个项集在数据集中出现的频率超过预先设定的最小支持度,则称其为频繁项集。Apriori算法的核心思想是“频繁项集的子集必须也是频繁的”,这被称为Apriori性质。算法分为两步:...
- 删除算法:首先找到待删除点,然后检查其是否有孩子节点,如果无孩子节点则直接删除,如果有两个孩子节点则找一个最近的替代节点,否则交换待删除节点与其孩子节点的位置,然后重新查找并删除替代节点。...
这个"fp_tree.rar_charge2t3_fp tree算法例题_fp_tree_fptree算法例题"压缩包包含了关于FP树算法的详细实例和解释,对于理解和实践FP树算法非常有帮助。 FP树算法的核心思想是通过构建一棵倒置的树结构,将数据集中...
本文档旨在为初学者提供一个关于FP-Tree算法的基础理解,帮助读者掌握其核心概念和技术细节。 #### 二、频繁模式挖掘的挑战 在进行频繁模式挖掘时,面临的主要挑战包括: 1. **多次扫描事务数据库**:为了发现...
K-D Tree是二叉树的一种变体,每一层的节点代表一个特征维度,每个内部节点分割空间的方式是对当前特征维度进行划分。K-D Tree的构建和查询都比简单的线性搜索效率更高,尤其在高维空间中,它显著减少了寻找最近邻的...
首先,选择一个维度(通常是当前最大方差的维度)对数据进行排序,然后取中点作为根节点。这个过程称为切分。接着,对左右子集分别递归地重复这个过程,每次选择不同的维度进行切分。这样,每个内部节点代表一个超...
【作品名称】:基于matlab实现KD-TREE与BBF算法的结合 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: 使用matlab...
- **头表(Header Table)**:FP-Tree的每个节点都有一个指向头表的指针,头表记录了该节点对应的项在FP-Tree中的所有实例。 - **连接操作**:当有多个相同的频繁项插入时,通过连接操作合并它们的计数,而不是...
FPTree算法主要由两个阶段组成:构建阶段和挖掘阶段。在构建阶段,算法首先对输入数据进行预处理,通过事务ID和项集来表示数据,并对每个项的出现频率进行统计。接着,根据这些频率构建一棵倒置的树结构——FPTree,...