题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。
例如输入整数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;
}
}
分享到:
相关推荐
对于含有n个内节点的二元树,证明E=I+2n。其中E、I分别为外部和内部路径长度。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。 打印出和与输入整数相等的所有路径。 例如 输入整数22和如下二元树 则打印出两条路径:10, 12和10, 5, 7。 先序遍历树即可得到结果。 算法: ...
Java实现蓝桥杯VIP算法训练 二元函数,使用Java实现二元函数
初学JAVA自己写的一个二元一次方程求解的程序,比较简单,适合初学者看看
二元树 及其应用的一个实例,源码
故障树分析法在实施过程中会遇到计算量...为了解决这个问题提出了一个将故障树转化为二元决策图的启发式算法,此算法既避免了基本事件排序这个难题,同时又充分考虑了故障树的具体结构,使得到的二元决策图尽量的简单。
Java解二元一次不定方程[axbyc].doc
我的二元树代码
二元查找树转变成排序...输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ / \ 4 8 12 16 转换成双向链表 4=6=8=10=12=14=16。
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表 要求不能创建任何新的节点,只调整指针的指向 微软面试题
* 某一集合上的二元关系类 * 提供关系的性质判断 关系间的运算 求关系的闭包 * 判断自反性 * 判断反自反性 * 判断对称性性 * 判断反对称性 * 判断传递性 * 关系和合成运算 * 关系自身与某一关系的运算 * ...
二叉树的层次遍历,是指从二叉树0层的根结点开始,按从上至下,从左至右的顺序访问二叉树中的每次结点。...在层次遍历过程中,对某一层的结点访问完后,再按照它们的访问次序对各个结点的左孩子和右孩子顺序访问
假设自上而下按层次,自左至右输入每个结点的一个三元组(N, P, L/R)。其中N为本结点的元素,P为其父结点,L指示N为P 的左孩子,R...试写一个建立二元树在内存的双链表示算法,并实现先根、中根、后根以及层序遍历算法。
遗传算法求二元一次函(包括一元一次)数最大值。里面有两个单独的例程,其中一个是二元一次函数的,另一个则是一元一次函数的,是和初步入门需要完成作业的小伙伴!
微软面试题第一题 直接就可以运行 不过二元查找树 不知道怎么自动生成 所以硬生生地一个个敲出来的 为了学习二元树的就不用下了
此文档是人工智能中的经典算法,决策树二元分类,里面包含多个word文档,十分优秀
1.方便获得一个字符串表示的矩阵 2.删除二维数组中的第几行 3.删除二维数组中与所要删除行内容一样的此行 4.获得此二维数组
二元一次方程组的解
(1)编写 AVL树判别程序,并判别一个二元查找树是否为 AVL树。二元查找树用其先序遍历结果表示,如:5,2,1,3,7,8。 (2)实现 AVL树的 ADT,包括其上的基本操作:结点的加入和删除;另外包括将一般二元查找树...