`
to_zoe_yang
  • 浏览: 138769 次
  • 性别: Icon_minigender_2
  • 来自: 01
社区版块
存档分类
最新评论

在二元树中找出和为某一值的所有路径

 
阅读更多

题目:

 

题目:输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如 输入整数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());
	}

 

非递归打印出来的只是符合要求的最后一个节点。

可以打印出栈的全部元素。

 

分享到:
评论
2 楼 kingj 2014-04-10  
将if(node.RightTree==null||node.RightTree==pre)
改为if(node.RightTree==null || node.RightTree==pre || node.LeftTree!=pre)
1 楼 kingj 2014-04-10  
非递归的算法在下面这种情况下会有问题
                          10
/   \
5     12
       /  \    /
      4    7  0
          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; 
            } 
会导致在遇到0的时候无限循环

相关推荐

    微软等公司数据结构+算法面试100题(含答案)

    4.在二元树中找出和为某一值的所有路径(树) 题目:输入一个整数和一棵二元树。 从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。 打印出和与输入整数相等的所有路径。 例如 输入整数22和如下...

    算法永远是王道(含微软面试100题)

    算法永远是王道(含微软面试100题) (把二元查找树转变成排序的双向链表;设计包含min函数的栈;求子数组的最大和;在二元树中找出和为某一值的所有路径;查找最小的k个元素等)

    数据结构关于迷宫问题

    要求设计程序输出如下:...(2)找出一条通路的二元组(i,j)数据序列,(i,j)表示通路上某一点的坐标。 (3)用一种标志(如数字8)在迷宫中标出该条通路; (4)在屏幕上输出迷宫和通路; (5)上述功能可用菜单选择

    C/C++程序员面试指南.杨国祥(带详细书签).pdf

    面试题15:在二元树中找出和为某一值的所有路径 第11章 排序 11.1 插入排序 面试题1:编码实现直接插入排序 面试题2:编码实现希尔(Shell)排序 11.2 交换排序 面试题3:编码实现冒泡排序 面试题4:编码实现快速...

    Facebook AI实验室开源的相似性搜索库Faiss.zip

    找出在城市规模、生活成本和便利设施方面相似的城市后,她便可以查看这些城市的薪资水平,从而确定它们是否与本公司的薪资水平一致。犯罪分析师希望搜索数据库以查看某罪行是否属于较重犯罪形式或有重罪趋势。课外...

    算法面试题500

    1.2.5. 在二元树中找出和为某一值的所有路径 .............................................. 22 1.2.6. Top K 算法详细解析---百度面试 ......................................................... 29 1.2.7. ...

    世界500强面试题.pdf

    1.2.5. 在二元树中找出和为某一值的所有路径 .............................................. 22 1.2.6. Top K 算法详细解析---百度面试 ......................................................... 29 1.2.7. ...

    LINGO软件的学习

    在LINGO中,只有在初始部分中给出的集属性值在以后的求解中可更改。这与前面并不矛盾,初始部分是LINGO求解器的需要,并不是描述问题所必须的。 2.3.2 定义派生集 为了定义一个派生集,必须详细声明: •集的名字 •...

    leetcode1185-LeetCode:这是我的LeetCode解决方案和笔记的笔记本

    找出两个数组之间的距离值 #1337. 矩阵中最弱的 K 行 #15. 3Sum(前指针和后指针) #347. 前 K 个频繁元素(堆) #203. 删除链表元素 动态规划 #1043. 最大和的分区数组 #264. 丑二号(万能DP) 搜索 #275. H-Index ...

    DS_ALGO:数据结构和算法

    找出a,b使a + b = X 合并后找到两个排序数组的中位数 图算法 图表示 广度优先搜索 深度优先搜索 拓扑排序 未加权图的最小路径 有向无环图的最短路径 Dijkstra的算法 Floyd Warshall算法 递归 河内塔 N皇后问题 ...

Global site tag (gtag.js) - Google Analytics