`

经典算法之递归

    博客分类:
  • Java
 
阅读更多
以树这样一个经典的案例,通过递归算法,实现获取所有的树节点。

方法一:递归时,加入当前节点
	//获取所有的树节点
	public List<XxxTree> getAllNodes(){
		List<XxxTree> list = new ArrayList<XxxTree>();
		List<XxxTree> rootList = getChildNodesById(0L);//获取根节点列表
		for(XxxTree root : rootList){
			doBuild(root, list);
		}
		return list;
	}
	
	//根据树节点id获取其所有直接子节点
	private List<XxxTree> getChildNodesById(Long id){
		String hql = "SELECT t FROM XxxTree t where t.uplink = ? ";
		return xxxDao.find(hql, new Object[]{id});
	}
	
	//递归获取:该节点以及该节点以下的所有的子节点
	private void doBuild(XxxTree obj, List<XxxTree> list){
		list.add(obj); //加入当前节点 
		List<XxxTree> childList = getChildNodesById(obj.getIdx());
		if(childList!=null && childList.size()>0){
			for(XxxTree child : childList){
				doBuild(child, list);
			}
		}
	}

方法二:递归时,加入当前节点的子节点列表
	//获取所有的树节点
	public List<XxxTree> getAllNodes(){
		List<XxxTree> list = new ArrayList<XxxTree>();
		List<XxxTree> rootList = getChildNodesById(0L);//获取根节点列表
		list.addAll(rootList);
		for(XxxTree root : rootList){
			doBuild(root, list);
		}
		return list;
	}
	
	//根据树节点id获取其所有直接子节点
	private List<XxxTree> getChildNodesById(Long id){
		String hql = "SELECT t FROM XxxTree t where t.uplink = ? ";
		return xxxDao.find(hql, new Object[]{id});
	}
	
	//递归获取:该节点以下的所有的子节点
	private void doBuild(XxxTree obj, List<XxxTree> list){
		List<XxxTree> childList = getChildNodesById(obj.getIdx());
		if(childList!=null && childList.size()>0){
			list.addAll(childList);//加入当前节点的子节点列表
			for(XxxTree child : childList){
				doBuild(child, list);
			}
		}
	}

上面两种方法实现递归的模拟实现,见附件,可以直接运行!

附:
oracle中connect by prior递归算法,例如:
SELECT * FROM tree START WITH idx = 123 CONNECT BY PRIOR idx = uplink
查询:idx为123的节点 以及该节点下面的所有子节点(递归)
http://www.cnblogs.com/chen1388/archive/2010/09/25/1834827.html
分享到:
评论

相关推荐

    .net 递归算法 .net 递归算法.net 递归算法

    在.NET编程环境中,递归算法是一种强大的工具,它允许函数或方法调用自身来解决复杂问题。递归的核心思想是将大问题分解为相同或相似的小问题,直到问题变得足够简单,可以直接得出答案。这种解决问题的方式在数据...

    C语言的经典算法包括递归等

    本文将深入探讨标题和描述中提到的“C语言的经典算法”,特别是递归和贪心算法。 首先,让我们来看看递归。递归是计算机科学中一个强大的概念,它是指一个函数或过程在其定义中调用自身的行为。在C语言中,递归通常...

    5!递归算法和非递归算法

    递归算法和非递归算法 在计算机科学与编程领域中,递归算法与非递归算法是两种非常重要的计算方法。本文将详细介绍这两种算法的特点、应用场景以及如何实现它们,特别针对初学者及面试准备者。 #### 递归算法 ...

    ACM基础算法之递归

    递归算法是ACM基础算法之一,通过运行时堆栈支持递归函数的实现。递归函数就是直接或间接调用自身的函数。许多教科书都把计算机阶乘和菲波那契数列用来说明递归,但是这些例子并没有提供任何优越之处。 本文通过一...

    牛顿迭代算法与递归算法的概念和区别

    牛顿迭代算法与递归算法的概念和区别 牛顿迭代算法和递归算法是两种常用的算法思想,它们在解决问题时具有不同的特点和应用场景。 牛顿迭代算法是一种数值分析方法,用于寻找函数的零点或极值点。该算法的基本思想...

    数据结构与算法之递归

    数据结构与算法之递归,深入浅出,很深刻,很透彻。

    18.递归算法与递归算法应用.ppt

    18.递归算法与递归算法应用.ppt

    递归算法详解递归算法详解

    - 阶乘数列是一个经典的递归应用例子。要计算n的阶乘,我们可以定义一个递归函数`f(n)`,其中`f(n) = n * f(n-1)`,并且`f(1) = 1`。这是一个基础的递归函数,因为它有两个退出条件:一个是基本情况(n=1),另一个...

    快速选择非递归与递归算法实现

    以上就是关于快速选择算法的非递归和递归实现的详细介绍。通过合理地选取基准和适当的数据结构,快速选择算法可以在大数据集上提供高效的k-th最小元素查找服务。在Java中的`QuickSelect.java`文件中,应该包含了这些...

    acm递归算法总结竞赛

    - **斐波那契数列**:经典的递归例子,第n个斐波那契数是前两个数之和,递归公式为F(n) = F(n-1) + F(n-2),基础情况是F(0)=0,F(1)=1。 - **阶乘计算**:n! = n * (n-1)!,基础情况是1! = 1。 5. **效率与栈空间...

    使用C++,请给出此题的递归算法及非递归算法。

    在编程领域,递归算法和非递归算法是两种常见的解决问题的方法。递归算法是通过函数或过程调用自身来解决复杂问题的方式,而非递归算法则是通过循环或其他逻辑结构来实现相同的目标。这里我们将详细探讨这两种算法在...

    digui.rar_分治法_经典算法_递归 算法

    在计算机科学领域,分治法和递归是两种非常重要的算法设计策略,它们在解决复杂问题时发挥着关键作用。本文将深入探讨这两种方法,并结合经典的算法实例进行讲解。 首先,我们来理解“分治法”(Divide and Conquer...

    数据结构和算法学习之递归

    在计算机科学中,数据结构和算法是编程的基础,而递归是解决复杂问题的重要方法之一。递归是一种在函数或程序中调用自身的技术,它通过简化问题来达到求解的目的。递归通常与分治策略相结合,将大问题分解为小的相似...

    VC对磁盘文件遍历搜索的递归算法和非递归算法

    在VC++(Visual C++)环境中,有多种方法可以实现这一目标,其中最常见的是递归算法和非递归算法。这两种方法各有优缺点,适用于不同的场景。 **递归算法**: 递归算法是一种基于函数自身调用解决问题的方法。在...

    算法分析 递归与分治策略 动态规划 贪心算法 分支限界法 随机化算法等算法

    在IT领域,算法是解决问题的核心工具,而递归与分治策略、动态规划、贪心算法、回溯法、分支限界法以及随机化算法都是其中的重要组成部分。这些算法不仅适用于计算机科学,也在数据结构、优化问题和复杂计算中扮演着...

    经典实例讲解C#递归算法

    - 斐波那契数列是递归的经典例子,每个数是前两个数的和。C#实现如下: ```csharp public static int Fibonacci(int n) { if (n ) return n; return Fibonacci(n - 1) + Fibonacci(n - 2); } ``` 这个实现...

    可并行递归算法的递归多线程实现

    例如,快速排序算法,一个经典的递归算法,可以通过并行处理两个子数组的排序过程,从而大幅减少排序所需的时间。 #### 实现细节:可并行的尾递归算法与多线程 快速排序算法通常遵循“分而治之”的策略,将数组...

    abap简单递归算法

    ### ABAP简单递归算法解析 #### 一、引言 ABAP(Advanced Business Application Programming)是一种用于SAP系统的编程语言。它不仅支持传统的过程化编程,还支持面向对象编程和Web开发。本文将深入探讨一个ABAP中...

Global site tag (gtag.js) - Google Analytics