题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。
例如输入整数22和如下二元树
10
/ \
5 12
/ \
4 7
则打印出两条路径:10, 12和10, 5, 7。
题目来源:http://zhedahht.blog.163.com/blog/static/254111742007228357325/
分析:题目需要从根节点开始遍历整棵树,并顺着路径记录节点的累加和,当到达某一节点时首先应该判别此路径上的节点和是都已经大于了需要的整数,如果大于,则放弃此条路径,如果小于则分别进入左、右节点继续上述步骤,当到达叶节点时判断累计值是否为指定整数,如相同则找到一条路径。为了打印出满足条件的路径,需要在遍历过程中记录节点顺序,本例采用Java中的LinkedList模拟先进先出队列的数据结构,将遍历过程中的节点依次加入队列,路径满足条件后从队列依次取出各节点值并打印。
代码如下:
package sumonepath;
/**
* 二元树中和为某一值的所有路径
* @author DHC
*
*/
public class SumOnePath {
private final int resultData = 22;
private static Node tree = SumOnePath.getTree();
public static void main(String[] args) {
new SumOnePath().doJob(tree);
}
private void doJob(Node tree) {
// 将本节点值加入路径队列
tree.getDataList().add(tree.getData());
// 更新路径节点的累加值
tree.setSum(tree.getSum() + tree.getData());
int sum = tree.getSum();
if (sum > resultData) {
return;
}
Node leftNode = tree.getLeftNode();
Node rightNode = tree.getRightNode();
if (leftNode != null || rightNode != null) {
if (leftNode != null) {
// 将路径加入左节点
leftNode.getDataList().addAll(tree.getDataList());
// 将累加值加入左节点
leftNode.setSum(tree.getSum());
doJob(leftNode);
}
if (rightNode != null) {
rightNode.getDataList().addAll(tree.getDataList());
rightNode.setSum(tree.getSum());
doJob(rightNode);
}
} else {
if (sum == resultData) {
printTree(tree);
}
}
}
/**
* 从队列取数据并打印
* @param node
*/
private void printTree(Node node) {
int size = node.getDataList().size();
for (int i = 0; i < size; i++) {
System.out.print(node.getDataList().pollFirst()+ " ");
}
System.out.print("\n");
}
/**
* 获取树
* @return
*/
private static Node getTree() {
Node node = new Node(10);
Node node1 = new Node(5);
Node node2 = new Node(4);
Node node3 = new Node(7);
Node node4 = new Node(12);
node.setLeftNode(node1);
node1.setLeftNode(node2);
node.setRightNode(node4);
node1.setRightNode(node3);
return node;
}
}
package sumonepath;
import java.util.LinkedList;
public class Node {
private Node leftNode;
private Node rightNode;
private int data;
/**
* 路径节点累加值
*/
private int sum;
/**
* 路径记录队列
*/
private LinkedList<Integer> dataList = new LinkedList<Integer>();
public LinkedList<Integer> getDataList() {
return dataList;
}
public void setDataList(LinkedList<Integer> dataList) {
this.dataList = dataList;
}
public int getSum() {
return sum;
}
public void setSum(int sum) {
this.sum = sum;
}
public Node(int data) {
this.data = data;
}
public Node getLeftNode() {
return leftNode;
}
public Node getRightNode() {
return rightNode;
}
public void setLeftNode(Node leftNode) {
this.leftNode = leftNode;
}
public void setRightNode(Node rightNode) {
this.rightNode = rightNode;
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
}
分享到:
相关推荐
4. **外部路径长度**:设EL为左子树的外部路径长度,ER为右子树的外部路径长度,E为整个二叉树的外部路径长度。根据归纳假设,我们有EL = IL + 2nL和ER = IR + 2nR。 5. **内部路径长度**:设IL为左子树的内部路径...
在实际编程中,二元树常被用于文件系统的目录结构、表达式求值、哈夫曼编码、图的最短路径计算等场景。例如,"二元树及其应用.cpp"可能包含一个二叉搜索树的实现,用于高效地存储和检索数据。实验报告"二元树及应用...
1. **类定义**:文件可能定义了一个名为`MyEquation`的类,这是Java中的标准做法,用于封装与求解二元一次方程相关的方法和数据。 2. **常量声明**:程序可能会有常量来存储方程的系数,如`a`, `b`, `c`, `d`, `e`,...
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。 打印出和与输入整数相等的所有路径。 例如 输入整数22和如下二元树 则打印出两条路径:10, 12和10, 5, 7。 先序遍历树即可得到结果。 算法: ...
- 如果一个节点有子节点,那么左子节点的值通常小于或等于该节点的值,而右子节点的值则大于或等于该节点的值(对于有序二元树)。 - 每个子节点可以独立构成一个二元树,形成树的分层结构。 2. **类型**: - ...
例如,我们可以定义一个名为`major2fo`的二元函数,用于计算两个整数的最大值: ```java public int major2fo(int a, int b) { return (a > b) ? a : b; } ``` 在这个函数中,`a`和`b`是输入参数,`int major2fo...
二元查找树(Binary Search Tree,BST)是一种特殊的数据结构,它的每个节点包含一个键、一个关联值、一个指向左子树的指针和一个指向右子树的指针。在二元查找树中,每个节点的键大于其左子树中的任何节点的键,且...
综上所述,"决策树二元分类"是一个入门级的数据分析项目,涵盖了决策树的基本原理、构建过程、二分类应用及Python实现,对于初学者来说,这是一个很好的起点,有助于理解机器学习中的分类算法。
故障树分析法在实施过程中会遇到计算量...为了解决这个问题提出了一个将故障树转化为二元决策图的启发式算法,此算法既避免了基本事件排序这个难题,同时又充分考虑了故障树的具体结构,使得到的二元决策图尽量的简单。
Java解二元一次不定方程[axbyc].doc
二元查找树转变成排序...输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ / \ 4 8 12 16 转换成双向链表 4=6=8=10=12=14=16。
在这个特定的场景中,遗传算法被应用于求解二元一次函数和一元一次函数的最大值。 一元一次函数通常具有形式f(x) = ax + b,其中a和b是常数,x是变量。这类函数的最值问题相对简单,最大值或最小值可以通过计算导数...
* 某一集合上的二元关系类 * 提供关系的性质判断 关系间的运算 求关系的闭包 * 判断自反性 * 判断反自反性 * 判断对称性性 * 判断反对称性 * 判断传递性 * 关系和合成运算 * 关系自身与某一关系的运算 * ...
1. OBDD.java:OBDD(Ordered Binary Decision Diagram)是二元决策图的有序形式,常用于简化布尔函数表示,尤其是故障树的逻辑表达。在这个上下文中,OBDD可能被用来有效地存储和操作动态故障树的逻辑结构。 2. ...
【数据建模】基于matlab模糊二元决策树的实现是一个重要的数据分析与决策支持技术。在本项目中,我们利用MATLAB这一强大的数值计算和数据分析工具来构建模糊二元决策树,这是一种处理不确定性和模糊性数据的有效方法...
假设自上而下按层次,自左至右输入每个结点的一个三元组(N, P, L/R)。其中N为本结点的元素,P为其父结点,L指示N为P 的左孩子,R...试写一个建立二元树在内存的双链表示算法,并实现先根、中根、后根以及层序遍历算法。
二元一次方程组与一元一次不等式组应用题 二元一次方程组是数学中一种基本的方程组形式,它广泛应用于经济、管理、工程等领域。二元一次方程组的应用题主要涉及到线性规划、资源分配、生产计划、物流配送等问题。...
首先,我们需要定义一个表示二元查找树节点的结构体`Node`,包含三个成员:一个整型变量`item`用于存储节点的值,以及两个指向子节点的指针`left`和`right`。 ```c struct Node { int item; Node *left; Node *...
在MATLAB中,路径规划是解决机器人导航、城市遍历问题的关键技术之一。这个压缩包文件"matla路径规划城市遍历机器人路径等问题精讲:9 求一元二元函数的最小值和零点.zip"显然包含了关于如何利用MATLAB求解一元和...
二元一次方程组是数学中的基础概念,它由两个含有两个未知数的一次方程组成。在解决这类问题时,我们通常的目标是找到这两个未知数的值,使得这两个方程同时成立。这个过程被称为解二元一次方程组,它是初等代数的...