`
阅读更多
树:n个节点的有限集

在非空树中,有且仅有一个根节点(Root

N>1时,其余节点分为m个互不相交的有限集,T1T2… Tm.


节点的度:节点拥有的子树

叶子节点:度为0的节点(没有子节点)

分支节点:度不为0的节点(还有子节点)

树的度:树内各个节点的度的最大值(有的节点度为0,1,2,3

那么树的度应该为3

孩子:节点子树的根

兄弟:同一父亲的孩子

堂兄弟:双亲在同一层次的节点的那些节点,比如EF和和HIJ

祖先:从根到该节点所经分支的所有节点

子孙:以某节点为根的子树的任意一节点

深度:树中节点的最大层次即有几层

有序树:树的各个节点的各个子树都看成是有序的

 


二叉树:每一个节点最多有两个子树即度<=2,子树有左右之分

 

 

满二叉树和完全二叉树的区别:

满二叉树:深度为k且有2^k-1个节点的二叉树,也就是说二叉树要平衡,而且子节点都有左右节点(叶子节点除外)
 

完全二叉树:首先必须有叶子节点,叶子节点的顺序是从左往右的,可以没有右孩子,但是不能没有左孩子,否则就不是完全二叉树

如果前一个节点都不存在左右节点,而后边存在左节点或者有节点,或者某一个节点存在右节点,但是没有左节点都不是完全二叉树


性质:

  • 完全二叉树的节点数如果为n那么,深度是+1;
  • 对于每一个完全二叉树的节点x,如果x=1,就是根节点,否则这个节点父节点为x/2;
  • 如果节点x*2>节点个数(n),那么表示没有左孩子结点,比如7*2>12表示7这个节点没有左孩子
  • 如果x*2+1 > 表示没有右孩子节点6*2+1>12,表示没有右孩子节点

二叉树的存储结构:

顺序存储结构:

将完全二叉树上编号为I的节点元素存储在一维数组下标为(i-1)上。

即(2i)一定是左节点,2i+1一定是右节点

 

链式存储结构:

为了避免空间的浪费,可以采用链式存储结构,因为非完全二叉树很有可能有很多地方都没有子节点,如果空着的话,空间就浪费了

 


遍历二叉树和线索二叉树

先序遍历:

访问根节点,先序遍历左子树,先序遍历右子树

中序遍历:

中序遍历左子树,访问根节点,中序遍历右子树

后续遍历

后续遍历左子树,后续遍历右子树,访问根节点  

其实就是看访问跟节点的先后顺序。

 

package com.dataStructure.tree;

import java.util.Stack;

public class TreeBean {
	private String nodeName;
	private TreeBean leftChild;
	private TreeBean rightChild;
	
	public TreeBean() {

	}
	
	public TreeBean(String nodeName, TreeBean leftChild, TreeBean rightChild) {
		this.nodeName = nodeName;
		this.leftChild = leftChild;
		this.rightChild = rightChild;
	}
	
	protected TreeBean initTree(){
		TreeBean leafNode1 = new TreeBean();
		leafNode1.setNodeName("D");
		TreeBean leafNode2 = new TreeBean();
		leafNode2.setNodeName("E");
		TreeBean leafNode3 = new TreeBean();
		leafNode3.setNodeName("F");
		TreeBean leafNode4 = new TreeBean();
		leafNode4.setNodeName("G");
		TreeBean brachNode1 = new TreeBean();
		brachNode1.setNodeName("B");
		brachNode1.setLeftChild(leafNode1);
		brachNode1.setRightChild(leafNode2);
		TreeBean brachNode2 = new TreeBean();
		brachNode2.setNodeName("C");
		brachNode2.setLeftChild(leafNode3);
		brachNode2.setRightChild(leafNode4);
		TreeBean rootNode = new TreeBean();
		rootNode.setNodeName("A");
		rootNode.setLeftChild(brachNode1);
		rootNode.setRightChild(brachNode2);
		
		return rootNode;
	}
	
	protected void visit(TreeBean node){
		System.out.print(node.getNodeName());
	}
	/**
	 * 前序排列的算法
	 * @param node
	 */
	protected void preOrderTraversal(TreeBean node){
		if(node == null ){
			return;
		}
		visit(node);//遍历root

		preOrderTraversal(node.getLeftChild());//遍历左节点
		preOrderTraversal(node.getRightChild());//遍历右节点
	}

	/**
	 * 中序遍历的算法
	 * @param node
	 */
	protected void inOrderTraversal(TreeBean node){
		if(node == null ){
			return;
		}
		inOrderTraversal(node.getLeftChild());//遍历左节点
		visit(node);//遍历root
		inOrderTraversal(node.getRightChild());//遍历右节点
	}

	/**
	 * 后序遍历的算法
	 * @param node
	 */
	protected void postOrderTraversal(TreeBean node){
		if(node == null ){
			return;
		}
		postOrderTraversal(node.getLeftChild());//遍历左节点
		postOrderTraversal(node.getRightChild());//遍历右节点
		visit(node);//遍历root
	}

	/**
	 * 非递归实现先序遍历
	 * @param node
	 */
	protected void preOrderNonRecursive_1(TreeBean node){
		//create a stack
		Stack<TreeBean> stack = new Stack<TreeBean>();
		if(node == null){
			return;
		}
		//先把父节点入栈
		stack.push(node);
		while(!stack.isEmpty()){
			node = stack.pop();//及入及出
			visit(node);
			//先放置右节点,后入先出
			if(node.getRightChild() != null){
				stack.push(node.getRightChild());
			}
			if(node.getLeftChild() != null){
				stack.push(node.getLeftChild());
			}
		}
	}

	/**
	 * 非遞歸先序遍历
	 * @param node
	 */
	protected void preOrderNonRecursive_2(TreeBean node){
		//create a stack
		Stack<TreeBean> stack = new Stack<TreeBean>();
		if(node == null){
			return;
		}
		TreeBean bean = node;
		
		while(bean != null || stack.size() > 0){
			//所有左节点入栈
			while(bean != null ){
				visit(bean);
				stack.push(bean);
				bean = bean.getLeftChild();
			}
			//画图一目了然
			if(stack.size() > 0){
				bean = stack.pop();
				bean = bean.getRightChild();
			}
		}
	}

	/**
	 * 非递归后序遍历双栈法
	 * @param node
	 */
	protected void postOrderNonRecursive_doubleStack(TreeBean node){
		Stack<TreeBean> stack = new Stack<TreeBean>();
		Stack<TreeBean> tmpStack = new Stack<TreeBean>();
		TreeBean bean = node;
		
		while (bean != null || stack.size() > 0) {
			while (bean != null) {
				tmpStack.push(bean);
				stack.push(bean);
				bean = bean.getRightChild();
			}
			if (stack.size() > 0) {
				bean = stack.pop();
				bean = bean.getLeftChild();
			}
		}
		while (tmpStack.size() > 0) {
			bean = tmpStack.pop();
			visit(bean);
		}
	}

	/**
	 * 非递归后序遍历单栈法
	 * @param node
	 */
	protected void postOrderNonRecursive_singleStack(TreeBean node) {
		Stack<TreeBean> stack = new Stack<TreeBean>();
		TreeBean bean = node, prev = node;
		while (bean != null || stack.size() > 0) {
			while (bean != null) {
				stack.push(bean);
				bean = bean.getLeftChild();
			}
			if (stack.size() > 0) {
				TreeBean temp = stack.peek().getRightChild();
				if (temp == null || temp == prev) {
					bean = stack.pop();
					visit(bean);
					prev = bean;
					bean = null;
				} else {
					bean = temp;
				}
			}

		}
	}

	/**
	 * 非递归中序遍历
	 * @param node
	 */
	protected void iterativeInorder2(TreeBean bean) {
		Stack<TreeBean> stack = new Stack<TreeBean>();
		TreeBean node = bean;
		while (node != null || stack.size() > 0) {
			while (node != null) {
				stack.push(node);
				node = node.getLeftChild();
			}
			if (stack.size() > 0) {
				node = stack.pop();
				visit(node);
				node = node.getRightChild();
			}
		}
	}
	
	/**
	 * 层次遍历(广度优先遍历)
	 * @param root
	 */
	protected void levelOrder(TreeBean root){
		if(root == null){
			return;
		}
		System.out.println("Level:");
		Queue<TreeBean> queue = new LinkedList<TreeBean>();
		TreeBean currentNode = null;
		TreeBean leftChildNode = null;
		TreeBean rightChildNode = null;
		queue.add(root);
		while(!queue.isEmpty()){
			currentNode = queue.poll();//出队列
			
			visit(currentNode);
			leftChildNode = currentNode.getLeftChild();
			rightChildNode = currentNode.getRightChild();
			//左右节点入队列
			if(leftChildNode != null){
				queue.add(leftChildNode);
			}
			if(rightChildNode != null){
				queue.add(rightChildNode);
			}
		}
	}
	public String getNodeName() {
		return nodeName;
	}
	public void setNodeName(String nodeName) {
		this.nodeName = nodeName;
	}
	public TreeBean getLeftChild() {
		return leftChild;
	}
	public void setLeftChild(TreeBean leftChild) {
		this.leftChild = leftChild;
	}
	public TreeBean getRightChild() {
		return rightChild;
	}
	public void setRightChild(TreeBean rightChild) {
		this.rightChild = rightChild;
	}

}

 

 

 

 

  • 大小: 88 KB
分享到:
评论

相关推荐

    stm32网络远程固件升级keil5工程

    STM32 开发板:选择合适的 STM32 系列开发板,如 STM32F407、STM32F767 等,需具备足够的存储容量(用于存放固件)、网络接口(如以太网接口或可外接 WiFi 模块等实现网络连接)。 网络模块(可选): 如果开发板本身没有集成网络接口,需要外接网络模块。例如,可选用 ESP8266、ESP32 等 WiFi 模块通过 SPI、USART 等接口与 STM32 开发板连接,实现无线连接到网络。 若开发板有以太网接口,如 STM32F407 开发板带有以太网 MAC 控制器,还需外接以太网 PHY 芯片(如 DP83848 等)及相应的网络变压器等元件来实现完整的以太网功能。

    1-全国各省份、各地级市、各区县逐年平均降水数据(1950-2022年)-社科数据.zip

    全国各省份、各地级市、各区县逐年平均降水数据集提供了从1950年至2022年的详细降水记录。这些数据覆盖了广泛的地理区域,包括不同的气候带和地形,为研究中国各地区的降水模式提供了宝贵资料。该数据集包含了省级、城市级和区县级的降水量,以年为单位,记录了日降水总量的年平均值,单位为米(m)。这些数据对于理解各地区的水资源状况、农业灌溉需求、防洪措施的制定等方面至关重要,并且对地理研究和经济管理研究具有重要的参考价值。数据集包含了省份、城市、区县以及每年的降水量等指标,以面板数据格式呈现,方便进行多维度分析。

    [net毕业设计]ASP.NET网上鲜花销售系统的设计(源代码+论文).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    2020年中国行政村级区划代码及经纬度 - 权威数据

    中国行政村级区划的经纬度数据,更是精准地描绘了每一个村落的地理位置。从北国的雪域高原到南疆的热带雨林,从东部的浩瀚大海到西部的广袤戈壁,每一个村落都以其独特的经纬度坐标,镶嵌在祖国的版图上。 指标 市级、市级代码、县级、县级代码、乡镇级、乡镇级代码、村级、村级代码、城乡分类代码、address、lng_84、lat_84。

    1-全国各省地区犯罪率统计数据1988-2020年-社科数据.zip

    全国各省地区犯罪率统计数据集提供了1988年至2020年的详细犯罪率数据,覆盖全国31个省份。这些数据通过刑事案件发生率来衡量社会犯罪率,为研究者提供了一个重要的社会犯罪变量测度。该数据集不仅记录了各省份每年的犯罪率,还包含了从1988年到2020年连续多年的统计数据,为分析犯罪趋势和模式提供了丰富的信息。此外,这些数据被广泛用于研究收入不平等与刑事犯罪之间的关系,以及其他社会经济因素对犯罪率的影响。通过这些数据,研究者可以深入探讨犯罪率与社会经济发展之间的联系,为制定相关政策提供科学依据。

    统计学课程设计报告说明.doc

    统计学课程设计报告说明.doc

    shell脚本编程实践,分享给有需要的人,仅供参考

    模拟退火算法shell脚本编程实践,分享给有需要的人,仅供参考。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    [net毕业设计]ASP.NET电子购物商城系统(源代码+论文).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    1-全国高校专利申请量与授权量统计数据1985-2020年-社科数据.zip

    全国高校专利申请量与授权量统计数据集提供了1985年至2020年间中国高校在专利领域的详细统计信息。这些数据不仅记录了高校专利申请和授权的数量,还涵盖了专利的类型,包括发明专利、实用新型专利和外观设计专利。该数据集是衡量高校科技创新成效的重要指标,反映了高校科研成果转化的机制完善程度和科研人员转化积极性。数据内容丰富,包括高校名称、年度、独立及联合申请的各类专利数量,以及授权的专利数量等关键指标。这些统计数据有助于分析和评估高校的创新能力和科技成果转化效率,对于研究高校科技创新政策、管理决策以及发展趋势具有重要价值。

    spark中文文档,spark操作手册以及使用规范

    spark中文文档,spark操作手册以及使用规范

    yolo算法-车辆行人数据集-127张图像带标签-汽车-人.zip

    yolo系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值

    员工培训授训积分标准表.docx

    员工培训授训积分标准表.docx

    神经网络项目介绍.docx

    神经网络项目介绍

    [net毕业设计]ASP.NET学生信息管理系统(源代码+论文).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    ASP物流管理系统设计(源代码+论文)(源代码+论文+说明文档).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    毕业设计心得.txtdfhfn

    毕业设计心得.txtdfhfn

    ASP+ACCESS人事管理系统设计(源代码+论文)(源代码+论文+说明文档).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    1-全国各地区(省)人口相关统计面板数据1990-2021年-社科数据.zip

    全国各地区(省)人口相关统计面板数据集覆盖了1990至2021年的时间跨度,提供了全国31个省的详细人口统计信息。该数据集包含了常住人口数、年末常住人口、各年龄段人口数、受教育人口数、出生人口数、人口自然增长率、死亡率以及人口性别比例等多项指标。数据内容涉及0-14岁、15-64岁、65岁及以上的人口分布,以及6岁及以上按性别和教育程度划分的人口结构。此外,还包括了15岁及以上未婚人口数、市县总人口数、家庭户和集体户人口数等细分数据。这些数据不仅涵盖了人口的自然增长和减少情况,还包括了人口性别比、农业人口与非农业人口数、城镇与乡村人口比重等重要社会经济指标。通过这些数据,研究人员可以深入分析中国各地区的人口变化趋势,为政策制定和社会科学研究提供有力支持。

    降成本工作流程说明表.docx

    降成本工作流程说明表.docx

    13.html

    13

Global site tag (gtag.js) - Google Analytics