数据结构之二叉树(Java)

二叉树——特点、性质、存储结构 一、二叉树的定义 折半查找引出。 1、二叉树的特点 1)每个结点最多有两棵子树 2)左子树和右子树是有顺序的,不能颠倒次序 3)即使树中只有一棵子树,也要区分是左子树 还是右子树 二叉树有5种形态: 空二叉树、只有一个根结点、根结点只有左子树、根结点只有右子树、根结点有左子树和右子树 2、特殊二叉树 1)斜树:      所有结点都只有左子树——左斜树      所有结点都只 阅读详情

二叉树

定义:(参照数据结构)

 * 树(Tree)的定义:树是n(n>=0)个节点的有限集合 T,若n=0,则为空树,否则
 *  (1)有且只有一个特殊的节点称为树的根节点;
 *  (2)若n>1时,其余的节点被分为m(m>0)个互不相交的子集T1,T2,...Tm,其中每个子集本身又是一颗树,
 *      称其为根的子树 
 *  
 *  二叉树(Binary Tree)的定义:二叉树是n(n>=0)个节点的有限集合,若n=0,为空树,否则:
 *  (1)有且只有一个特殊的称为树的根节点;
 *  (2)若n>1时,其余节点被分为两个互不相交的子集T1,T2,分别称之为左右子树,并且左右子树又都是二叉树。

1.二叉树的遍历:先序遍历、中序遍历、后续遍历、层次遍历

2.求叶子节点数

3.求二叉树的深度

class BinaryTree{
	
	/**
	 * 二叉树:
	 * 遍历:(L:左子树,D:根节点;R:右子树)
	 */
	
	/**
	 * 先序遍历DLR:
	 * 		若二叉树为空,遍历结束,否则
	 * 		(1)访问根节点;
	 * 		(2)先序遍历左子树(递归调用本算法)
	 * 		(3)先序遍历右子树(递归调用本算法)
	 * 
	 */
	public static void DLR(Node root) {
		if (root == null) {
			return;
		}
		System.out.println(root.data); //访问根节点
		DLR(root.left); //递归遍历左子树
		DLR(root.right);//递归遍历右子树
	}
	
	
	/**
	 * 中序遍历LDR:
	 * 		若二叉树为空,遍历结束,否则
	 * 		(1)先序遍历左子树(递归调用本算法)
	 * 		(2)访问根节点;
	 * 		(3)先序遍历右子树(递归调用本算法)
	 * 
	 */
	public static void LDR(Node root) {
		if (root == null) {
			return;
		}
		LDR(root.left); //递归遍历左子树
		System.out.println(root.data); //访问根节点
		LDR(root.right);//递归遍历右子树
	}
	
	/**
	 * 后序遍历LRD:
	 * 		若二叉树为空,遍历结束,否则
	 * 		(1)先序遍历左子树(递归调用本算法)
	 * 		(2)先序遍历右子树(递归调用本算法)
	 * 		(3)访问根节点;
	 * 
	 */
	public static void LRD(Node root) {
		if (root == null) {
			return;
		}
		LRD(root.left); //递归遍历左子树
		LRD(root.right);//递归遍历右子树
		System.out.println(root.data); //访问根节点
	}
	
	/**
	 * 层次遍历二叉树
	 * 借助队列
	 */
	public static void LevelTree(Node root) {
		if (root == null) {
			return;
		}
		Queue<Node> queue = new ArrayDeque<Node>();
		queue.add(root);
		while(!queue.isEmpty()) {
			Node node = queue.poll();//获取队首元素,并从队列中删除
			System.out.println(node.data);
			if (node.left != null) {
				queue.add(node.left); //左节点入队
			}
			if (node.right != null) {
				queue.add(node.right); //右节点入队
			}
			
		}
		
	}
	
	/**
	 * 获取叶子节点数
	 * 依然使用递归
	 */
	public static int getLeafs(Node root) {
		if (root != null) {
			if (root.left == null && root.right == null) {
				return 1;
			}else {
				return getLeafs(root.left)+getLeafs(root.right);
			}
		}
		return 0;
	}
	
	/**
	 * 获取二叉树的深度
	 * 借助层次遍历
	 */
	public static int getHeight(Node root) {
		if (root == null) {
			return 0;
		}
		int h = 0;
		int front = 0 ,rear =1;
		Queue<Node> queue = new ArrayDeque<Node>();
		queue.add(root);
		while(!queue.isEmpty()) {
			Node node = queue.poll();//获取队首元素,并从队列中删除
			front++;
			if (node.left != null) {
				queue.add(node.left); //左节点入队
			}
			if (node.right != null) {
				queue.add(node.right); //右节点入队
			}
			if (front == rear) { //front 与rear相等时,当前层的节点遍历完成
				h++;
				rear = queue.size(); //记录了下一层的节点数
				front = 0;
			}
			
		}
		return h;
	}
}

class Node{
	//树节点
	//二叉链表的存储结构
	int data;
	Node left;
	Node right;
	public Node() {
		super();
	}
	public Node(int data) {
		super();
		this.data = data;
	}
}

public class Tree {
	
	//测试
	public static void main(String[] args) {
		//创建一棵二叉树 9(5(2,7),13(12(10),14))
		Node root = new Node(9);
		Node node1 = new Node(5);Node node2 = new Node(13);
		root.left = node1; root.right = node2;
		
		Node node1_1 = new Node(2); Node node1_2 = new Node(7);
		node1.left = node1_1; node1.right = node1_2;
		
		Node node2_1 = new Node(12); Node node2_2 = new Node(14);
		node2.left=node2_1; node2.right=node2_2;
		Node node2_1_1 = new Node(10);
		node2_1.left = node2_1_1;
		
//		Node node2_1_1_1 = new Node(11);
//		node2_1_1.right = node2_1_1_1;
//		Node node2_2_1 = new Node(15);
//		node2_2.right = node2_2_1;
		
		BinaryTree binaryTree = new BinaryTree();
		
		//先序遍历 9 5 2 7 13 12 10 14 
		binaryTree.DLR(root);
		System.out.println("############");
		//中序遍历 2 5 7 9 10 12 13 14 
		binaryTree.LDR(root);
		System.out.println("############");
		//后序遍历  2 7 5 10 12 14 13 9  
		binaryTree.LRD(root);
		System.out.println("############");
		//层次遍历 9 5 13 2 7 12 14 10 
		binaryTree.LevelTree(root);
		System.out.println("获取叶子节点数:"+binaryTree.getLeafs(root)); //4
		System.out.println("二叉树的高度:"+binaryTree.getHeight(root));
		
	}

}

 

Java数据结构之树和二叉树 现在开始学习新的数据结构–树(树形结构) 它是重要的非线性数据结构,区别之前学习的链表和栈者(这些是一对一的线性结构),树是一对多结构。 从定义开始: 树(Tree)是n(n>=0)个节点的有限集合。 在任意一棵非空树中有 有且只有一个特定的节点称为根(Root) 当n大于1的时候,其余节点可以分为m(m>0)个互不相交的有限集合T1,T2,T3,… Tm;其中每个集合本身又可以是一棵树,称为子树。 有关树(Tree)的的相关术语: 节点(Node):包一个数据元素以及指向其他子树的指针(分 阅读详情

相关推荐

Java 数据结构之二叉树

二叉树 二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个结点最多只能有两棵子树,且有左右之分。 二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个结点。 二叉树的实现之前、中、后

m0_52846268的博客 1209

【Java数据结构】二叉树

核心:树中每个节点最多只能有两个子节点(t>=0&&t<=2) 下面实现的是一个二叉排序树(左孩子小于父节点,右孩子大于父节点) 1.插入节点 核心思想: (1)如果不存在节点,则直接插入。 (2)从根节点开始查找一个相应的节点,即新节点的父节点,当父节点找到后,根据新节点的值来确定新节点是连接到左子节点还是右子节点。 2....

weixin_34205076的博客 223

数据结构与算法——二叉树详解java

我们有序数组查找快,可以通过二分查找快速的查找到数据,但是要在有序数组中插入一个数的话,就必须先找到插入数据项的位置,然后将所有插入位置后面的数据项后移以为,给新的数据腾出空间,同时删除数据也是一样的道理,可以知道这样的话是很浪费时间的, 同时另外的一种数据结构——链表,链表的插入和删除很快,我们只需要改变一些引用,但是查找数据就会很慢,因为我们无论查找到什么数据,都需要从链表的第一个数据开始,遍...

qq_40688338的博客 1166

Java数据结构之二叉树

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看 起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。

linhai166025的博客 1058

JAVA数据结构与算法之————二叉树

JAVA数据结构和算法之————二叉树 树节点结构:TreeNode package tree; public class TreeNode<E> implements Cloneable { private E data = null; private TreeNode<E> lChild = null; private TreeNode<...

qq_36007633的博客 887

保姆级教程:在SIwave 2024 R2中搞定TDR仿真,手把手教你分析USB 3.0差分线阻抗

本文提供了一份详细的SIwave 2024 R2 TDR仿真教程,重点讲解如何分析USB 3.0差分线阻抗。从项目准备、参数配置到结果分析,逐步指导工程师完成完整的仿真流程,并分享实战经验和高级技巧,帮助提升信号完整性分析能力。

weixin_33670786的博客 494

Java数据结构——二叉树

本文介绍了Java数据结构中的非线性结构,二叉树的概念以及题目练习

2401_89019969的博客 1637

opencode 完全指南:终端AI编程助手的安装、模型配置与实战

在AI编程助手快速迭代的当下,开发者对终端环境下的自动化编码需求愈发强烈。以自然语言驱动代码修改、命令执行与测试验证,已成为提升工程效率的重要方向。这类工具普遍遵循模型无关的设计原则,通过兼容OpenAI格式的接口接入多种大模型,并借助多会话管理、Skills、Memory等机制实现可审查、可干预的闭环流程。从安装配置到日常使用,再到apihub网关与免费模型的接入,终端AI助手在代码审查、跨文件重构、浏览器自动化验证等场景中展现出独特价值。本文聚焦opencode这一开源CLI工具,详细拆解其核心定位、模

weixin_33868027的博客 417

java 数据结构 二叉树

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看 起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:有一个特殊的结点,称为根结点,根结点没有前驱结点

N_0050的博客 1036

ATE测试的未来:自动化与智能化的技术演进

本文探讨了自动测试设备(ATE)在半导体产业中的技术演进,重点关注自动化与智能化的发展趋势。随着芯片制程的不断进步,ATE面临测试复杂度激增和成本压力等挑战。文章分析了AI技术在测试优化中的应用,如自适应测试和缺陷预测,以及模块化架构和端到端测试生态系统的创新。这些技术突破显著提升了测试效率和设备利用率,为半导体测试的未来发展指明了方向。

weixin_29232507的博客 614

从理论到实践:TRL去嵌入校准在国产矢量网络分析仪上的应用全解析

本文全面解析了TRL去嵌入校准技术在国产矢量网络分析仪上的应用实践,从核心算法到工程实现。详细介绍了TRL校准的数学原理、国产VNA的程控接口开发、校准件质量评估及测量不确定度控制策略,帮助工程师掌握高频器件测量的关键技术。

tech5的博客 1011

数据结构-5.Java. 二叉树

本篇博客给大家带来的是二叉树的知识点, 其中包括面试经常会提问的真题 ArrayList 和 LinkedList 的区别 .文章专栏:Java-数据结构若有问题 评论区见如果你不知道分享给谁,那就分享给薯条。你们的支持是我不断创作的动力 .

薯条不要番茄酱的博客 3114

批量导入经纬度点到奥维地图中

随便说说 最近出来出差,天天东奔西跑的,跑完了回到酒店还得整理一天的成果,基本上晚上9点才能整理完,累的基本上倒头就睡,没时间鼓捣自己喜欢的东西了。但想着也得写点啥吧,想来想去就那最近工作中用到的东西吧。因为我们现在的工作内容呢,基本上就是按照着上面给的地理位置找到地方开始检查。所以呢,就需要批量的把手上的经纬点信息导入到地图中,安排好路线,利用导航高效的找到地方。给的坐标就是gps点,wgs-84的,使用奥维地图最方便了,不用做坐标转换直接能用。所以作为组里的gis担(苦)当(力),这个导坐标的活就由我来

lionhenryzxxy的博客 3万+

Java数据结构:初识二叉树

本篇将开启二叉树探索之旅,初识非线性结构,认识什么是树🌳 ,什么是二叉树,让我们发车吧 初一十五的月亮  天天变的不一样  原来所谓地久天长  也只是误会一场 那首歌我慢慢唱  你问我爱你有多深  我爱你有几分 —— 月亮代表谁的心 DT

LL_break的博客 2041

SRC漏洞挖掘实战:从攻击面管理到业务逻辑漏洞的精准狩猎

在网络安全领域,漏洞挖掘是识别和利用软件系统中安全弱点的核心实践。其基本原理在于通过系统化的方法,识别和评估一个应用或系统的攻击面,并从中定位安全防护的薄弱环节。这项技术的价值在于能够主动发现潜在风险,防患于未然,对于保障企业数字资产安全至关重要。典型的应用场景包括对Web应用、移动端API以及各类在线业务系统的安全性评估。在实际的漏洞挖掘,尤其是针对安全应急响应中心(SRC)的实战中,高效的策略往往聚焦于**边缘资产**的发现与利用,以及对**业务逻辑漏洞**的模式化测试。掌握这些经过验证的思路,能帮助安

babing2770的博客 414

17、自适应和学习索引:在线物理设计调整的新维度

本文探讨了现代数据库管理系统中自适应索引和数据库裂解的新方法,通过结合学习模型与多臂老虎机(MAB)框架,实现在线物理设计调整。文章详细介绍了自适应索引的工作原理、数据库裂解技术以及如何利用机器学习进行索引选择和优化,并讨论了MAB框架在动态调整索引结构中的应用及其实际案例。

go5gopher的博客 81

数据结构(Java)——二叉树

本文主要讲二叉树的概念、专业术语、遍历和一些其他的操作

wx2023_10_15的博客 2122

LLaMA Factory多卡微调的实战教程(持续更新)

本文主要介绍了LLaMA Factory多卡微调的实战教程(持续更新),希望对学习大语言模型的同学们有所帮助。 文章目录 1. 前言 2. 配置环境 2.1 安装虚拟环境 2.2 安装依赖库 2.3 模型选型与下载 2.4 配置多卡环境 3. 运行代码 3.1 构建训练数据 3.2 修改配置文件 3.3 微调 3.3.1 zero3微调 3.3.2 启动API 3.3.3 模型测试

herosunly的博客 25万+

数据结构的Java实现——二叉树

二叉树的二叉链表实现、先序、中序、后序遍历实现

山顶冻人的专栏 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

数据结构二叉树的Java实现

本篇博文用java实现了数据结构中的二叉树 源码分享在github:数据结构,当然你也可以从下面的代码片中获取 1.二叉树节点类 BiTreeNode.java package code.tree; public class BiTreeNode { public Object data;//节点的数据域 public BiTreeNode lChild,rChild;//左右孩...

baidu_41860619的博客 593

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java数据结构(二叉树)

二叉树(Binary Tree) 是一种非线性的数据结构,由节点组成,每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树可以为空(没有节点),也可以是一个根节点加上两个互不相交的左子树和右子树。如图所示:满二叉树和完全二叉树是两种特殊的二叉树结构。满二叉树:所有层都填满节点的二叉树,即每个节点要么是叶子节点,要么有两个子节点。完全二叉树:除了最后一层外,其他所有层都被完全填满,并且最后一层的节点全部靠左排列。

2301_79482961的博客 1003

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Java数据结构之二叉树及其源码实现

二叉树简单源码实现及广度优先遍历

pgcdnameming的博客 2231

Java 数据结构与算法之二叉树

一、树的概念 1、树的概念:树,作为非线性数据结构的典型例子,不再是一对一,而是一对多的关系。示例图如下 根节点(root) :最顶部节点,唯一的 父节点和子节点:parent,child是相对的 子节点:每个子节点只有一个父节点 叶子节点:没有子节点的节点称为叶子节点(leaf) 2、树的相关术语:示意图如下 节点的度:该节点的子节点个数,8的度为2 树的度:这棵树内子节点...

大魔王的博客 479

【Java数据结构】03-二叉树,树和森林

讲解二叉树、树和森林的定义以及它们之间的异同点,四种遍历、二叉检索树、Huffman编码以及堆的实现、树和森林与二叉树的转换

m0_73569204的博客 1450
上一篇: 数据结构之队列(java)
下一篇: 二叉查找树(java)
^^_candice
博客等级 码龄10年 3粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值