题目:
题目:输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如 输入整数22和如下二元树
10
/ \
5 12
/ \
4 7
则打印出两条路径:10, 12和10, 5, 7。
思路:有两种方法,递归和非递归。其中非递归使用前序遍历,一条路走到底,并且每次访问一个节点,就判断当前访问的节点是否符合要求,符合就进栈保持,不然就退栈,对退出来的节点判断是否有右子树,有就继续往下,否则就继续退栈。
代码:
递归:
public void findPath(BiSearchTree node,int sum, String path){
sum = sum - node.data;
if(sum<0){
return;
}else if(sum==0){
path = path + " " + node.data;
System.out.println("Path: "+path);
}else{
if(node.LeftTree!=null){
findPath(node.LeftTree, sum , path + " " + node.data);
}
if(node.RightTree!=null){
findPath(node.RightTree, sum,path + " " + node.data);
}
}
}
非递归:
public void findPath(BiSearchTree node,int sum){
BiSearchTree pre = null;
Stack stack = new Stack();
do{
while(node!=null){
sum = sum - node.data;
if(sum<0){
break;
}else if(sum==0){
pre = node;
sum = sum + node.data;
System.out.println("I find "+node.data);
}else{
stack.push(node);
}
if(node.LeftTree!=null)
pre = node;
node = node.LeftTree;
}
node = (BiSearchTree)stack.pop();
if(node.RightTree==null||node.RightTree==pre){
pre = node;
sum = sum + node.data;
node = null;
}else {
stack.push(node);
pre = node;
node = node.RightTree;
}
}while(!stack.IsEmpty());
}
非递归打印出来的只是符合要求的最后一个节点。
可以打印出栈的全部元素。
分享到:
相关推荐
4.在二元树中找出和为某一值的所有路径(树) 题目:输入一个整数和一棵二元树。 从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。 打印出和与输入整数相等的所有路径。 例如 输入整数22和如下...
算法永远是王道(含微软面试100题) (把二元查找树转变成排序的双向链表;设计包含min函数的栈;求子数组的最大和;在二元树中找出和为某一值的所有路径;查找最小的k个元素等)
要求设计程序输出如下:...(2)找出一条通路的二元组(i,j)数据序列,(i,j)表示通路上某一点的坐标。 (3)用一种标志(如数字8)在迷宫中标出该条通路; (4)在屏幕上输出迷宫和通路; (5)上述功能可用菜单选择
面试题15:在二元树中找出和为某一值的所有路径 第11章 排序 11.1 插入排序 面试题1:编码实现直接插入排序 面试题2:编码实现希尔(Shell)排序 11.2 交换排序 面试题3:编码实现冒泡排序 面试题4:编码实现快速...
找出在城市规模、生活成本和便利设施方面相似的城市后,她便可以查看这些城市的薪资水平,从而确定它们是否与本公司的薪资水平一致。犯罪分析师希望搜索数据库以查看某罪行是否属于较重犯罪形式或有重罪趋势。课外...
1.2.5. 在二元树中找出和为某一值的所有路径 .............................................. 22 1.2.6. Top K 算法详细解析---百度面试 ......................................................... 29 1.2.7. ...
1.2.5. 在二元树中找出和为某一值的所有路径 .............................................. 22 1.2.6. Top K 算法详细解析---百度面试 ......................................................... 29 1.2.7. ...
在LINGO中,只有在初始部分中给出的集属性值在以后的求解中可更改。这与前面并不矛盾,初始部分是LINGO求解器的需要,并不是描述问题所必须的。 2.3.2 定义派生集 为了定义一个派生集,必须详细声明: •集的名字 •...
找出两个数组之间的距离值 #1337. 矩阵中最弱的 K 行 #15. 3Sum(前指针和后指针) #347. 前 K 个频繁元素(堆) #203. 删除链表元素 动态规划 #1043. 最大和的分区数组 #264. 丑二号(万能DP) 搜索 #275. H-Index ...
找出a,b使a + b = X 合并后找到两个排序数组的中位数 图算法 图表示 广度优先搜索 深度优先搜索 拓扑排序 未加权图的最小路径 有向无环图的最短路径 Dijkstra的算法 Floyd Warshall算法 递归 河内塔 N皇后问题 ...