`
to_zoe_yang
  • 浏览: 143196 次
  • 性别: 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的时候无限循环

相关推荐

    Google微软-华为腾讯-面试笔试数据结构和算法编程题目和部分答案

    这其中包括了二元查找树转换为排序双向链表、设计包含min函数的栈、求子数组的最大和、在二元树中找出和为某一值的所有路径、查找最小的k个元素等题目。这些题目都是常见的数据结构和算法面试题目,旨在考察面试者的...

    matla路径规划城市遍历机器人路径等问题精讲:9 求一元二元函数的最小值和零点.zip

    在MATLAB中,路径规划是解决机器人导航、城市遍历问题的关键技术之一。这个压缩包文件"matla路径规划城市遍历机器人路径等问题精讲:9 求一元二元函数的最小值和零点.zip"显然包含了关于如何利用MATLAB求解一元和...

    面试中经常被问到的80道算法题

    在这道题中,我们需要在一个二元树中找出所有和为某一值的路径。为了实现这一目标,我们需要对二元树进行遍历,并使用合适的算法来计算路径的和。 知识点五: 查找最小的 k 个元素 在这道题中,我们需要从一个数组...

    c语言实现离散的真值表判断、并交差集、判断二元关系、判断欧拉图

    并集操作可以将两个集合的所有元素合并到一个集合中,交集操作找出两个集合共有的元素,而差集则表示在第一个集合中存在的但不在第二个集合中的元素。理解这些操作对于数据结构和算法的设计至关重要。 3. **判断...

    算法面试题总结_嵌入式-常用知识&面试题库_大厂面试真题.doc

    4. 在二元树中找出和为某一值的所有路径:本题目考察了二元树和算法的知识,要求从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径,并打印出和与输入整数相等的所有路径。解决方法是使用递归算法...

    微软公司等数据结构+算法面试100题 第1 100题 全部出炉

    4. 在二元树中找出和为某一值的所有路径: - 该问题要求在二元树中找出从根节点到叶子节点的所有路径,这些路径上的节点值之和等于给定值。 - 需要使用深度优先搜索(DFS)算法,递归遍历二元树的所有节点,并将...

    微软等数据结构+算法面试100题

    在二元树中找出和为某一值的所有路径 此题目要求在给定的二元树中,找到所有节点值之和等于给定整数值的路径。这通常可以通过深度优先搜索(DFS)算法来实现,从根节点开始递归地遍历整个树,同时计算从根节点到...

    c和c++500强面试题

    5. 在二元树中找出和为某一值的所有路径:这是一个递归遍历二元树并记录路径和的问题。可以通过深度优先搜索(DFS)来实现,在递归过程中累加路径上的节点值,当达到叶子节点且路径和等于目标值时,记录该路径。 **...

    微软等数据结构+算法面试100题首次完整亮相

    本文将详细解析“微软等数据结构+算法面试100题首次完整亮相”的关键知识点,包括但不限于二元查找树转化为排序的双向链表、设计包含min函数的栈、求子数组的最大和以及在二元树中找出和为某一值的所有路径。...

    【史上最全】算法面试题集锦.pdf

    4. 在二元树中找出和为某一值的所有路径 知识点:二元树遍历、路径问题、回溯法 要找出二元树中所有和为目标值的路径,可以使用回溯法。从根节点开始,递归遍历每个节点,并记录当前路径的和。当达到叶节点时,判断...

    微软等公司数据结构+算法面试100题

    在二元树中找出和为某一值的所有路径 **题目描述**:给定一个整数target和一棵二元树,找出所有路径上的节点值之和等于target的路径。 **解决方案**:采用深度优先搜索(DFS)策略。从根节点开始递归,每经过一个...

    数据结构C问题

    **五、在二元树中找出和为某一值的所有路径** 在二元树中找出所有和为特定值的路径,通常采用深度优先搜索(DFS)策略。从根节点开始,递归地探索每条可能的路径,同时维护一条路径上的节点值总和。当到达叶子节点...

    数据结构+算法面试100题.pdf

    4. 在二元树中找出和为某一值的所有路径 本题目要求输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。解决这个问题的关键是正确...

    刀疤鸭之数据结构面试题

    5. 二元树中找出和为某一值的所有路径: 这个问题可以通过深度优先搜索(DFS)来解决,需要递归地在树中寻找所有可能的路径,直到找到总和等于目标值的路径。 ***K算法: TopK算法涉及到在一组数中找出前k个最大...

    二元一次方程应用题13种经典习题.doc

    在数学的领域中,二元一次方程组作为基础工具之一,在我们的生活中扮演着不可或缺的角色。它不仅仅是一个简单的数学概念,更是一种解决实际问题的强有力手段。在中学数学的框架内,二元一次方程组因其广泛的应用性,...

    [珍藏版]微软等数据结构+算法面试100题全部出炉[100题V0.1最终完美版]

    #### 2.2 在二元树中找出和为某一值的所有路径 **题目概述**:给定一个整数值和一棵二元树,找出所有从根节点到叶子节点的路径,使得路径上所有节点值的和等于给定的整数值。 **解题思路**: - 采用深度优先搜索...

    二元关系的闭包运算

    例如,传递闭包可以通过Warshall算法来求解,这是一个简单的迭代过程,用于找出所有可能的传递路径。自反和对称闭包则相对直观,只需要直接添加对应的元素对即可。 至于“可视化”,这通常指的是通过图形界面展示...

    各大公司算法面试题

    在二元树中找出和为某一值的所有路径 - **知识点**: 二元树、深度优先搜索(DFS)。 - **解析**: - 要找出二元树中和为特定值的所有路径,可以使用深度优先搜索(DFS)策略,从根节点开始递归地访问每个节点,并...

Global site tag (gtag.js) - Google Analytics