`

递归调用

阅读更多

题目描述:

 要求:写一个函数void count(char* input,int len),此函数的功能是计算出一个字符串中每个字符的个数,不区分 大小写,输出结果时按字符在字符串中出现的先后顺序。使用程序语言不限。

例如:input="abCcbdfe",输出结果是a:1 b:2 c:2 d:1 f:1 e:1 *

思路 :构造一颗完全2叉树,每个结点储存1个value和此value出现的次数

难点:如何添加新结点

总结:对递归理解不深刻,2叉树理解不深刻

未解决:显示顺序不正确

代码

 

package com.ysb;
/*
 *  要求:写一个函数void count(char* input,int len),此函数的功能是计算出一个字符串中每个字符的个数,不区分大小写,输出结果时按字符在字符串中出现的先后顺序。使用程序语言不限。
	例如:input="abCcbdfe",输出结果是a:1 b:2 c:2 d:1 f:1 e:1 *
	
	使用2叉树实现 例子中的对应的2叉树
				   a1
			b2	        c2
		d1      f1   e1   g1
	 h1	  i1  		
	 
 */
public class Main {
	
	public static void main(String[] args) {
		
		new Main().start();
	}
	public void start() {
		String input = "abcabcdeabcfgghfghswrwer";
		Tree tree = new Tree();
		Node rootNode = new Node();
		rootNode.setValue(input.charAt(0));
		rootNode.setCount(1);
		rootNode.setParentNode(null);
		tree.setRootNode(rootNode);
		tree.setDeep(1);
		tree.setCount(1);
		//构建2叉数
		for(int i = 1;i<input.length();i++) {
			char c = input.charAt(i);
			//如果找不到该字符,则创建新节点,这里是难点啊
			Node node = listTree(tree.getRootNode(), c);
			if(node == null) {
				Node newNode = new Node();
				newNode.setCount(1);
				newNode.setValue(c);
				//增加1个结点
				addNewNode( tree, newNode);
			}
			else {
				node.setCount(node.getCount()+1);
			}
		}
		showResult(tree);
	}
	private void addNewNode(Tree tree, Node newNode) {
		Node rootNode = tree.getRootNode();
		Node parentNode = findParentNode(rootNode);
		if(parentNode.getLeftNode() == null)
			parentNode.setLeftNode(newNode);
		else
			parentNode.setRightNode(newNode);
		tree.setCount(tree.getCount()+1);
		int count = 1;
		for(int i=1;i<=tree.getDeep();i++)
			count = 2*count;
		count = count -1;
		if(tree.getCount() > count)
			tree.setDeep(tree.getDeep()+1);
		
	}
    /*
     * 返回第一个缺少子树的节点
     */
	private Node findParentNode(Node node) {
		
		Node testNode;
		if(node.getLeftNode() == null || node.getRightNode()==null)
			return node;
		else {
			Node leftNode = node.getLeftNode();
			testNode = 	findParentNode(leftNode);
			if(testNode!=null)
				return testNode;
			Node rightNode = node.getRightNode();
			testNode =findParentNode(rightNode);
			if(testNode!=null)
				return testNode;
		}
		return null;
	}
	/**
	 * @param node   传入的根节点
	 * @param value  比较的char值
	 * @return 如果有节点的value值与传入的value值相同,则返回该节点
	 *         否则返回null
	 */
	public  Node listTree(Node node,char value) {	
		Node testNode;
		if(node!=null) {
			char c = node.getValue();
			if(c == value)
					return node;
			testNode = listTree(node.getLeftNode(),value);
			if(testNode!=null) {
				return testNode;
			}
			testNode = listTree(node.getRightNode(),value);
			if(testNode!=null) {
				return testNode;
			}
		}
		return null;
	}
	public void visitNode(Node node) {
		if(node!=null) {
			System.out.println(node.getValue()+":"+node.getCount());
			visitNode(node.getLeftNode());
			visitNode(node.getRightNode());
		}
	}
	//显示结果有问题,并没有按照字符出现的顺序,而是按照树的遍历顺序,这个再说
	public void showResult(Tree tree) {
		Node rootNode = tree.getRootNode();
		visitNode(rootNode);
	}
}
Tree的数据结构
package com.ysb;

public class Tree {
	//树的深度,从1开始
	private int deep;
	//树的根结点
	private Node rootNode;
	//树的结点数
	private int count;
	public int getCount() {
		return count;
	}
	public void setCount(int count) {
		this.count = count;
	}
	public int getDeep() {
		return deep;
	}
	public void setDeep(int deep) {
		this.deep = deep;
	}
	public Node getRootNode() {
		return rootNode;
	}
	public void setRootNode(Node rootNode) {
		this.rootNode = rootNode;
	}
	
}
   Node的数据结构
package com.ysb;

public class Node {
	private Node leftNode;
	private Node rightNode;
	private Node parentNode;
	private char value;
	private int count;
	public Node getLeftNode() {
		return leftNode;
	}
	public void setLeftNode(Node leftNode) {
		this.leftNode = leftNode;
	}
	public Node getRightNode() {
		return rightNode;
	}
	public void setRightNode(Node rightNode) {
		this.rightNode = rightNode;
	}
	public char getValue() {
		return value;
	}
	public void setValue(char value) {
		this.value = value;
	}
	public int getCount() {
		return count;
	}
	public void setCount(int count) {
		this.count = count;
	}
	public Node getParentNode() {
		return parentNode;
	}
	public void setParentNode(Node parentNode) {
		this.parentNode = parentNode;
	}
	

}
 
分享到:
评论
2 楼 sambean 2010-11-27  
chinpom 写道
这个题目,用得着写这么多代码用二叉树吗?是不是LZ把问题搞复杂了,还是必须得用递归?

不是啊,我只是试试二叉树咯。。
1 楼 chinpom 2010-11-05  
这个题目,用得着写这么多代码用二叉树吗?是不是LZ把问题搞复杂了,还是必须得用递归?

相关推荐

    递归调用详解,分析递归调用的详细过程[参考].pdf

    "递归调用详解" 递归调用是软件开发中一个重要的概念,它是函数实现的一个很重要的环节,许多程序中都或多或少的使用了递归函数。递归的意思就是函数自己调用自己本身,或者在自己函数调用的下级函数中调用自己。...

    函数递归调用堆栈分析.doc

    函数递归调用堆栈分析 函数递归调用堆栈分析是指在计算机科学中,函数递归调用时,函数调用自身的过程中,如何使用堆栈来存储变量和参数的过程。堆栈是一种 lasts-in-first-out(LIFO)的数据结构,用于存储函数...

    一个简单的递归调用的实例

    在这个“一个简单的递归调用的实例”中,我们将深入探讨递归调用在.NET项目中的应用,特别是如何利用递归来遍历目录树。 递归调用的基本思想是,一个问题的解可以分解为一个或多个与原问题相同但规模更小的子问题。...

    C语言函数递归调用学习教案.pptx

    C语言函数递归调用学习教案 C语言函数递归调用是指在调用一个函数的过程中,出现直接或间接地调用该函数本身的现象。递归调用可以用来解决一些复杂的问题,但也需要注意递归调用的深度和性能问题。 函数的递归...

    C语言函数递归调用PPT课件.pptx

    C语言函数递归调用PPT课件 函数的递归调用是指在调用一个函数的过程中,出现直接或间接地调用该函数本身的现象。例如,函数f调用函数f1,函数f1调用函数f2,函数f2调用函数f1,这样就形成了一个递归调用链。 递归...

    递归调用详解,分析递归调用的详细过程

    递归调用详解,代码详细讲解了如递归调用以及调用中应该注意的一些问题

    C语言函数的嵌套调用和递归调用PPT课件.pptx

    C语言函数的嵌套调用和递归调用 本文主要介绍C语言函数的嵌套调用和递归调用,包括函数的递归调用、变量的作用域和存储类型等知识点。 函数的递归调用 函数的递归调用是指函数直接或间接地自我调用的一种调用方式...

    3.7 函数的递归调用(ppt).pdf

    在MATLAB编程中,函数的调用方式有多种,其中包括函数的嵌套调用和递归调用。这里我们将深入探讨这两个概念。 1. **函数的嵌套调用**: 函数的嵌套调用是指在一个函数的定义内部,直接或间接地调用了其他函数。这种...

    32位无符号乘法/递归调用程序

    该程序通过一系列汇编指令实现了32位无符号乘法的计算,并通过递归调用子程序的方式输出计算结果。通过对输入输出、数据处理及计算逻辑的详细解析,我们不仅可以了解该程序的具体工作原理,还能学习到如何使用汇编...

    树的无限分级递归调用

    在本话题中,我们将深入探讨“树的无限分级递归调用”这一主题,特别关注如何在Visual Studio 2010环境下利用递归实现树的层级遍历。递归是一种函数或过程在其定义中直接或间接地调用自身的技术,常用于解决具有重复...

    C语言递归调用举例

    C语言递归调用举例,可直接复制粘贴。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。...

    一个递归调用的存储过程

    递归调用的存储过程是指该存储过程在其执行过程中会调用自身,形成一种自相似的结构,通常用于处理层次数据或者实现特定的算法。在给定的标题“一个递归调用的存储过程”中,我们可以推测这个存储过程利用了递归机制...

    java实现递归调用

    本篇文章将详细介绍如何使用Java实现递归调用来遍历一棵树,并结合SQL代码进行说明。 首先,我们需要理解树的基本概念。树是一种非线性的数据结构,由节点(或称为顶点)和边组成。每个节点可以有零个或多个子节点...

    有关TreeView递归调用

    ### 有关TreeView递归调用 #### 知识点概览 在.NET框架中,`TreeView` 控件常被用于展示具有层次结构的数据,如文件系统、组织结构等。通过递归调用的方式绑定数据到`TreeView` 控件是实现这一功能的有效手段之一。...

    .net TreeView 动态绑定数据库 无限级树目录 递归调用

    本主题将深入探讨如何在.NET中利用TreeView控件动态地从数据库中加载并显示无限级别的目录结构,同时使用递归调用来实现这一功能。 首先,我们要理解动态绑定的概念。动态绑定是指在运行时根据需要从数据源加载数据...

    C语言函数的嵌套调用和递归调用学习教案.pptx

    C语言函数的嵌套调用和递归调用学习教案.pptx

    vue 组件递归调用

    vue组件递归调用,展示树状结构,

    使用c语言实现递归调用, 主要考察递归调用

    ### 使用C语言实现递归调用 #### 一、递归的基本概念 递归是一种算法设计方法,在这种方法中,函数直接或间接地调用自身。递归通常用于解决那些可以分解为更小规模同类问题的问题。一个递归算法通常包含两个部分:...

    VB6.0过程的递归调用

    递归调用是指在执行一个过程或函数时,该过程或函数又在其内部直接或间接地调用自身。这种调用方式可以解决某些复杂问题,如树遍历、分治策略和动态规划等。下面我们将深入探讨VB6.0中递归调用的原理、实现方法、优...

    算法进阶 01 递归调用 打表

    在编程领域,算法是解决问题的关键,而递归调用是算法设计中的一种重要技术。递归调用是指函数或方法在执行过程中调用自身的过程,它通常用于解决那些可以通过简化问题规模来解决的问题。本节将深入探讨递归调用的...

Global site tag (gtag.js) - Google Analytics