`
luoweifu
  • 浏览: 64474 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

 
阅读更多


树定义和基本术语

定义

树(Tree)是n(n≥0)个结点的有限集T,并且当n>0时满足下列条件:

(1)有且仅有一个特定的称为根(Root)的结点;

(2)当n>1时,其余结点可以划分为m(m>0)个互不相交的有限集T1、T2 、…、Tm,每个集Ti(1≤i≤m)均为树,且称为树T的子树(SubTree)

特别地,不含任何结点(即n=0)的树,称为空树

如下就是一棵树的结构:

图1.树

基本术语

结点

存储数据元素和指向子树的链接,由数据元素和构造数据元素之间关系的引用组成。

孩子结点

树中一个结点的子树的根结点称为这个结点的孩子结点,如图1中的A的孩子结点有B、B、D

双亲结点

树中某个结点有孩子结点(即该结点的度不为0),该结点称为它孩子结点的双亲结点,也叫前驱结点。双亲结点和孩子结点是相互的,如图1中,A的孩子结点是B、B、D,B、B、D的双亲结点是A。

兄弟结点

具有相同双亲结点(即同一个前驱)的结点称为兄弟结点,如图1中B、B、D为兄弟结点。

结点的度

结点所有子树的个数称为该结点的度,如图1,A的度为3,B的度为2.

树的度

树中所有结点的度的最大值称为树的度,如图1的度为3.

叶子结点

度为0的结点称为叶子结点,也叫终端结点。如图1的K、L、F、G、M、I、J

分支结点

度不为0的结点称为分支结点,也叫非终端结点。如图1的A、B、C、D、E、H

结点的层次

从根结点到树中某结点所经路径的分支数称为该结点的层次。根结点的层次一般为1(也可以自己定义为0),这样,其它结点的层次是其双亲结点的层次加1.

树的深度

树中所有结点的层次的最大值称为该树的深度(也就是最下面那个结点的层次)。

有序树和无序树

树中任意一个结点的各子树按从左到右是有序的,称为有序树,否则称为无序树


树的抽象数据类型描述

数据元素:具有相同特性的数据元素的集合。

结构关系:树中数据元素间的结构关系由树的定义确定。

基本操作:树的主要操作有

(1)创建树IntTree(&T)

创建1个空树T。

(2)销毁树DestroyTree(&T)

(3)构造树CreatTree(&T,deinition)

(4)置空树ClearTree(&T)

将树T置为空树。

(5)判空树TreeEmpty(T)

(6)求树的深度TreeDepth(T)

(7)获得树根Root(T)

(8)获取结点Value(T,cur_e,&e)

将树中结点cur_e存入e单元中。

(9)数据赋值Assign(T,cur_e,value)

将结点value,赋值于树T的结点cur_e中。

(10)获得双亲Parent(T,cur_e)

返回树T中结点cur_e的双亲结点。

(11)获得最左孩子LeftChild(T,cur_e)

返回树T中结点cur_e的最左孩子。

(12)获得右兄弟RightSibling(T,cur_e)

返回树T中结点cur_e的右兄弟。

(13)插入子树InsertChild(&T,&p,i,c)

将树c插入到树T中p指向结点的第i个子树之前。

(14)删除子树DeleteChild(&T,&p,i)

删除树T中p指向结点的第i个子树。

(15)遍历树TraverseTree(T,visit())


树的实现

树是一种递归结构,表示方式一般有孩子表示法和孩子兄弟表示法两种。树实现方式有很多种、有可以由广义表的递归实现,也可以有二叉树实现,其中最常见的是将树用孩子兄弟表示法转化成二叉树来实现。

孩子兄弟表示法

孩子表示法

下面以孩子表示法为例讲一下树的实现:

树的定义和实现

package datastructure.tree;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
/**
 * 树的定义和实现
 * @author Administrator
 *
 */
public class Tree {
	private Object data;
	private List<Tree> childs;
	
	public Tree(){
		data = null;
		childs = new ArrayList();
		childs.clear();
	}
	
	public Tree(Object data) {
		this.data = data;
		childs = new ArrayList();
		childs.clear();
	}

	/**
	 * 添加子树
	 * @param tree 子树
	 */
	public void addNode(Tree tree) {
		childs.add(tree);
	}

	/**
	 * 置空树
	 */
	public void clearTree() {
		data = null;
		childs.clear();
	}

	/**
	 * 求树的深度
	 * 这方法还有点问题,有待完善
	 * @return 树的深度
	 */
	public int dept() {
		return dept(this);
	}
	/**
	 * 求树的深度
	 * 这方法还有点问题,有待完善
	 * @param tree
	 * @return
	 */
	private int dept(Tree tree) {
		if(tree.isEmpty()) {
			return 0;
		}else if(tree.isLeaf()) {
			return 1;
		} else {
			int n = childs.size();
			int[] a = new int[n];
			for(int i=0; i<n; i++) {
				if(childs.get(i).isEmpty()) {
					a[i] = 0+1;
				} else {
					a[i] = dept(childs.get(i)) + 1;
				}
			}
			Arrays.sort(a);
			return a[n-1];
		}
	}
	/**
	 * 返回递i个子树
	 * @param i
	 * @return
	 */
	public Tree getChild(int i) {
		return childs.get(i);
	}

	/**
	 * 求第一个孩子 结点
	 * @return
	 */
	public Tree getFirstChild() {
		return childs.get(0);
		
	}

	/**
	 * 求最后 一个孩子结点
	 * @return
	 */
	public Tree getLastChild() {
		return childs.get(childs.size()-1);
	}

	public List<Tree> getChilds() {
		return childs;
	}

	/**
	 * 获得根结点的数据
	 * @return
	 */
	public Object getRootData() {
		return data;
	}

	/**
	 * 判断是否为空树
	 * @return 如果为空,返回true,否则返回false
	 */
	public boolean isEmpty() {
		if(childs.isEmpty() && data == null)
			return true;
		return false;
	}
	
	/**
	 * 判断是否为叶子结点
	 * @return
	 */
	public boolean isLeaf() {
		if(childs.isEmpty())
			return true;
		return false;
	}

	/**
	 * 获得树根
	 * @return 树的根
	 */
	public Tree root() {
		return this;
	}

	/**
	 * 设置根结点的数据
	 */
	public void setRootData(Object data) {
		this.data = data;
	}

	/**
	 * 求结点数
	 * 这方法还有点问题,有待完善
	 * @return 结点的个数 
	 */
	public int size() {
		return size(this);
	}
	/**
	 * 求结点数
	 * 这方法还有点问题,有待完善
	 * @param tree
	 * @return
	 */
	private int size(Tree tree) {
		if(tree.isEmpty()) {
			return 0;
		}else if(tree.isLeaf()) {
			return 1;
		} else {
			int count = 1;
			int n = childs.size();
			for(int i=0; i<n; i++) {
				if(!childs.get(i).isEmpty()) {
					count += size(childs.get(i));
				}
			}
			return count;
		}
	}
}

树的遍历

树的遍历有两种

前根遍历

(1).访问根结点;

(2).按照从左到右的次序行根遍历根结点的第一棵子树;

后根遍历

(1).按照从左到右的次序行根遍历根结点的第一棵子树;

(2).访问根结点;

Visit.java

package datastructure.tree;

import datastructure.tree.btree.BTree;

/**
 * 对结点进行操作的接口,规定树的遍历的类必须实现这个接口
 * @author Administrator
 *
 */
public interface Visit {
	/**
	 * 对结点进行某种操作
	 * @param btree 树的结点
	 */
	public void visit(BTree btree);
}

order.java

package datastructure.tree;


import java.util.List;
/**
 * 树的遍历
 * @author Administrator
 *
 */
public class Order {
	/**
	 * 先根遍历
	 * @param root 要的根结点
	 */
	public void preOrder(Tree root) {
		if(!root.isEmpty()) {
			visit(root);
			for(Tree child : root.getChilds()) {
				if(child != null) {
					preOrder(child);
				}
			}
		}
	}
	/**
	 * 后根遍历
	 * @param root 树的根结点
	 */
	public void postOrder(Tree root) {
		if(!root.isEmpty()) {
			for(Tree child : root.getChilds()) {
				if(child != null) {
					preOrder(child);
				}
			}
			visit(root);
		}
	}
	
	public void visit(Tree tree) {
		System.out.print("\t" + tree.getRootData());
	}

}

测试:

要遍历的树如下:



package datastructure.tree;

import java.util.Iterator;
import java.util.Scanner;

public class TreeTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Tree root = new Tree("A");
		root.addNode(new Tree("B"));
		root.addNode(new Tree("C"));
		root.addNode(new Tree("D"));
		Tree t = null;
		t = root.getChild(0);
		t.addNode(new Tree("L"));
		t.addNode(new Tree("E"));
		t = root.getChild(1);
		t.addNode(new Tree("F"));
		t = root.getChild(2);
		t.addNode(new Tree("I"));
		t.addNode(new Tree("H"));
		t = t.getFirstChild();
		t.addNode(new Tree("L"));

		System.out.println("first node:" + root.getRootData());
		//System.out.println("size:" + root.size());
		//System.out.println("dept:" + root.dept());
		System.out.println("is left:" + root.isLeaf());
		System.out.println("data:" + root.getRootData());
		
		Order order = new Order();
		System.out.println("前根遍历:");
		order.preOrder(root);
		System.out.println("\n后根遍历:");
		order.postOrder(root);
		
	}

}

结果:

first node:A
is left:false
data:A
前根遍历:
A B L E C F D I L H
后根遍历:
B L E C F D I L H A


分享到:
评论

相关推荐

    电机控制领域Harnefors观测器的Matlab仿真模型及其在PMSM无感控制中的高效应用

    内容概要:本文详细介绍了Harnefors观测器在永磁同步电机(PMSM)无感控制中的应用,特别是其在Matlab 2020b环境下的仿真模型。Harnefors观测器以其简洁的十行核心代码实现了对电机角度的精确估算,仅需调整单一参数lambda即可应对各种工况。文中展示了该观测器在初始角度误差极大情况下的优异收敛性能,以及在带载启动和多种速度指令下的稳定性。此外,模型中引入的有效磁链概念使得同一观测器能够兼容表贴式和内嵌式电机,进一步提升了其实用性和灵活性。仿真结果显示,该观测器不仅能在极端条件下迅速收敛,还能在不同电机参数下保持稳定的性能表现。 适合人群:从事电机控制系统设计与开发的技术人员,尤其是关注无感FOC技术和观测器优化的研究人员。 使用场景及目标:①用于研究和开发高性能无感FOC系统;②评估和改进现有电机控制系统的观测器设计;③为初学者提供一个简洁而高效的观测器实现案例,帮助理解和掌握相关技术。 其他说明:文章提供了详细的代码片段和实验数据,便于读者进行复现和进一步探索。同时,强调了模型的扩展性和实用性,特别是在不同类型的永磁同步电机中的应用。

    COMSOL相场法在水力压裂模拟中的应用:从单一裂缝到复杂多簇裂缝的数值实现

    内容概要:本文详细介绍了使用COMSOL软件中的相场法进行水力压裂模拟的技术细节。首先探讨了单一裂缝的扩展机制,包括相场参数的选择如界面厚度参数(epsilon)、断裂能(Gc),以及各向异性分散设置的影响。接着逐步深入到多个裂缝簇的竞争扩展,特别是两簇和三簇裂缝之间的应力阴影效应及其对裂缝形态的影响。文中还讨论了水力裂缝与天然裂缝相交时的特殊处理方法,如接触条件设定、摩擦系数调整等。此外,文章强调了网格划分、时间步长设置等数值模拟的关键技巧,并展示了如何利用相场变量的动态可视化来直观地观察裂缝的生长过程。 适合人群:从事石油工程、地质力学、计算力学等领域研究的专业人士和技术人员。 使用场景及目标:适用于希望深入了解水力压裂过程中裂缝形成机理的研究人员,以及希望通过数值模拟优化压裂作业的设计工程师。主要目标是掌握相场法的基本原理及其在COMSOL平台上的具体实现方式,从而更好地理解和预测实际工程中的裂缝行为。 其他说明:文章不仅提供了详细的MATLAB代码片段用于指导具体的建模步骤,还分享了许多实用的经验和技巧,帮助读者规避常见的数值发散等问题。同时,通过对不同工况的对比分析,揭示了相场法在处理复杂裂缝网络方面的优势。

    管道清污机器人sw16可编辑_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip

    管道清污机器人sw16可编辑_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip

    keras-3.3.2.tar.gz

    该资源为keras-3.3.2.tar.gz,欢迎下载使用哦!

    C语言课程设计的一些经典项目以及源码.zip

    C语言课程设计的一些经典项目以及源码.zip

    水果采摘机器人sw22_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip

    水果采摘机器人sw22_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip

    爬百度文库ppt(1).py

    爬百度文库ppt(1)

    新能源电机sw22可编辑_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip

    新能源电机sw22可编辑_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip

    基于CNN-LSTM的锂离子电池健康状态SOH估计方法及其Python实现

    内容概要:本文详细介绍了利用CNN-LSTM混合模型进行锂离子电池健康状态(SOH)估计的方法。首先,通过对NASA公开数据集的分析,提取了三个关键特征:放电电压最低点时间、平均放电电压和平均放电温度。接着,构建了一个由卷积神经网络(CNN)和长短时记忆网络(LSTM)组成的混合模型,用于捕捉电池数据的局部特征和时序依赖。模型经过精心调参和优化,在NASA B0005和B0006电池数据集上取得了优异的表现,RMSE低于1.5%,MAPE控制在1.5%左右。此外,文中提供了完整的Python代码实现,包括数据预处理、模型搭建、训练和结果可视化的具体步骤。 适合人群:从事电池管理系统的研发人员、机器学习工程师以及对深度学习应用于电池健康管理感兴趣的科研工作者。 使用场景及目标:适用于需要精确评估锂离子电池健康状态的应用场合,如电动汽车、储能系统等领域。主要目标是提高电池使用寿命预测的准确性,从而优化电池维护计划并延长设备使用寿命。 其他说明:文中强调了特征选择的重要性,并指出合理的特征工程可以显著提升模型性能。同时提醒使用者在实际应用中结合电池管理系统的实时数据进行在线校准,以获得更好的预测效果。

    三相不平衡电压下T型NPC三电平并网逆变器的控制策略与实现

    内容概要:本文详细探讨了在三相不平衡电压条件下,T型NPC三电平并网逆变器的控制策略及其具体实现方法。首先介绍了正负序分离技术,利用复数旋转因子和双二阶广义积分器(DSOGI)进行坐标变换,将三相电压分解为正序和负序分量。接着讨论了中点电位平衡问题,采用零序电压注入的方法并通过PI调节器来稳定中点电位。随后阐述了空间矢量脉宽调制(SVPWM)的具体实现步骤,包括矢量选择逻辑和作用时间计算。此外,文章还涉及电流环参数的设计,提供了基于电网阻抗特性的PI参数调整方法。最后展示了仿真实验结果,验证了所提出控制策略的有效性和优越性能。 适合人群:电力电子工程师、从事逆变器研究的技术人员以及相关领域的研究生。 使用场景及目标:适用于需要解决三相不平衡电压问题的并网逆变器控制系统设计,旨在提高系统的稳定性、可靠性和效率。 其他说明:文中提供的代码片段和仿真模型有助于读者更好地理解和应用这些控制策略。建议读者结合实际硬件条件进行适当调整,并参考相关文献深入学习。

    GEE教学-个快快版-共28讲.rar

    GEE教学-个快快版-共28讲.rar

    电路仿真:射频电路仿真.zip

    电子仿真教程,从基础到精通,每个压缩包15篇教程,每篇教程5000字以上。

    thai-scalable-tlwgtypewriter-fonts-0.6.5-1.el8.x64-86.rpm.tar.gz

    1、文件说明: Centos8操作系统thai-scalable-tlwgtypewriter-fonts-0.6.5-1.el8.rpm以及相关依赖,全打包为一个tar.gz压缩包 2、安装指令: #Step1、解压 tar -zxvf thai-scalable-tlwgtypewriter-fonts-0.6.5-1.el8.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm

    永磁同步电机5次7次电流谐波抑制的Simulink仿真建模与实现

    内容概要:本文详细介绍了如何利用Simulink搭建永磁同步电机(PMSM)的谐波注入补偿模型,重点在于抑制5次和7次电流谐波。文中解释了谐波产生的原因及其危害,如电机发热、振动增加等问题。随后逐步讲解了如何使用Simulink中的各个模块(如PMSM模块、Universal Bridge、PI Controller、FFT模块等),并通过协调这些模块实现了谐波的有效抑制。此外,还探讨了谐波提取、谐振控制器设计、补偿信号发生器的设计细节,以及如何应对转速突变工况下的挑战。通过实验验证,该模型能够显著降低5次和7次谐波含量,提高电机性能。 适合人群:从事电机控制系统设计的研究人员和技术工程师,尤其是对永磁同步电机谐波抑制感兴趣的读者。 使用场景及目标:适用于需要深入理解和掌握永磁同步电机谐波抑制技术的研发人员,旨在帮助他们构建高效的谐波抑制系统,提升电机运行效率和稳定性。 其他说明:文中提供了详细的Matlab/Simulink代码片段和配置建议,有助于读者快速上手实践。同时,强调了实际应用中的注意事项,如选择合适的求解器、设置合理的参数等,确保仿真的准确性。

    T型三电平逆变器VSG控制与LCL滤波器的双闭环设计及优化

    内容概要:本文详细介绍了基于T型三电平逆变器的虚拟同步机(VSG)控制技术,涵盖VSG的核心算法、中点电位平衡策略以及LCL滤波器的双闭环控制设计。首先探讨了VSG控制的基本原理,包括虚拟惯量和阻尼特性的模拟,以及有功-频率和无功-电压下垂控制的具体实现。针对T型三电平拓扑特有的中点电位漂移问题,提出了多种平衡控制方法。对于LCL滤波器,讨论了其参数设计和双闭环控制策略,特别是电流环PI参数的选择和避免谐振的方法。文中还提供了多个实用的经验公式和调试技巧,并引用了相关领域的权威文献作为理论支持。 适合人群:从事电力电子、新能源并网系统研究和开发的技术人员,尤其是有一定电力电子基础的研发人员。 使用场景及目标:适用于需要深入了解和掌握VSG控制技术和LCL滤波器设计的研究人员和技术开发者。主要目标是帮助读者理解和实现T型三电平逆变器的VSG控制,提高系统的稳定性和性能。 其他说明:文中不仅提供了详细的理论解释,还有具体的代码实现和调试建议,便于读者进行实际操作和验证。同时强调了调试过程中需要注意的安全事项和常见问题的解决方案。

    【数学建模竞赛】美国大学生数学建模竞赛(MCM/ICM)简介:竞赛规则与意义综述

    内容概要:美国大学生数学建模竞赛(MCM/ICM)由美国数学及其应用联合会主办,旨在提高学生运用数学知识和计算机技术解决实际问题的能力,培养团队合作精神和创新思维。竞赛始于1985年,至今已有近40年历史,是全球最具影响力的数学建模竞赛之一。竞赛分为MCM和ICM两部分,涵盖多个领域,参赛队伍需在4天内完成题目的分析、建模、求解和论文撰写。竞赛面向全球在校大学生,设有多个奖项,获奖对学生的升学和就业有积极影响。参赛队伍应提前学习数学建模知识,掌握常用软件工具,如MATLAB、Python等,同时加强团队协作和时间管理能力。; 适合人群:全球范围内的在校大学生,特别是对数学建模感兴趣的学生。; 使用场景及目标:①提高学生运用数学知识和计算机技术解决实际问题的能力;②培养团队合作精神和创新思维;③为升学和就业积累宝贵经验。; 阅读建议:参赛队伍应提前做好充分准备,学习相关数学建模知识,熟悉常用软件工具,加强团队协作和时间管理能力,以应对竞赛的挑战。

    动态测试技术:振动试验.zip

    电子电力仿真教程 ,15篇,5000字,从入门到精通,案例为主。

    汽车横梁拧螺丝设备sw22可编辑_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip

    汽车横梁拧螺丝设备sw22可编辑_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip

    基于三电平逆变器的有源滤波APF设计及其Matlab/Simulink仿真验证

    内容概要:本文详细介绍了基于三电平逆变器的有源电力滤波器(APF)的设计及Matlab/Simulink仿真验证。首先阐述了三电平逆变器的基本原理,包括其拓扑结构和优势。接着讨论了APF的核心功能,即通过检测电网中的谐波电流并生成补偿电流来抵消谐波。文中给出了具体的谐波检测算法和补偿电流生成控制策略,如瞬时无功功率理论和谐波检测算法、SVPWM控制算法等。最后,通过搭建Matlab/Simulink仿真模型,验证了所设计方案的有效性,展示了APF投入前后电网电流谐波含量的显著变化,证明了三电平逆变器在APF中的优越性能。 适合人群:电气工程专业学生、从事电力电子研究的技术人员、对电力系统谐波治理感兴趣的科研工作者。 使用场景及目标:适用于高校教学、企业研发部门和技术培训课程。主要目标是帮助读者掌握三电平逆变器的工作原理、APF的设计思路及其实现方法,同时提供详细的仿真指导,以便于实际工程项目中的应用。 其他说明:文章不仅提供了理论分析,还包括了大量的代码示例和具体的操作步骤,有助于读者更好地理解和实践。此外,文中还指出了仿真过程中常见的几个问题及解决方案,进一步提高了实用性和可靠性。

    基于频率滑动广义互相关的信号时延估计方法及其MATLAB实现

    内容概要:本文详细介绍了信号时延估计这一重要信号处理任务,涵盖了从经典方法到创新方法的发展历程。首先解释了时延估计的基础概念及其广泛应用背景,如声纳定位、语音增强、地震勘探和雷达测距等领域。接着分别探讨了几种经典时延估计方法,包括基于相关分析的方法、高阶累积量方法、特征结构分析方法、代价函数优化方法以及自适应处理方法,指出了各自的优势和局限性。重点介绍了基于频率滑动广义互相关(FSGCC)的创新方法,该方法通过在频域内滑动窗口,计算广义互相关函数,提高了时延估计的精度和鲁棒性,尤其适用于非平稳信号和强噪声环境。文中还提供了详细的MATLAB代码示例,展示了如何生成带有时延的信号、实现各种时延估计方法,并比较了不同方法在不同条件下的性能。 适合人群:从事信号处理研究和技术开发的专业人士,尤其是对时延估计感兴趣的科研人员和工程师。 使用场景及目标:①理解和掌握多种时延估计方法的工作原理;②学习如何在MATLAB中实现这些方法;③探索频率滑动广义互相关方法在实际工程中的应用潜力。 其他说明:文章不仅提供了理论讲解,还包括了大量的代码实例,帮助读者更好地理解和实践。此外,还讨论了一些实际应用中的注意事项,如计算复杂度和实时性要求等。

Global site tag (gtag.js) - Google Analytics