二叉树基础及实现(一)

目录: 
一. 树的基本概念
二. 二叉树概念及特性
三. 二叉树的基本操作
一. 树的基本概念:
1 概念
树是一种非线性的数据结构,它是由nn>=0 )个有限结点组成一个具有层次关系的集合 把它叫做树是因为它看 起来像一棵 倒挂的树 ,也就是说它是 根朝上,而叶朝下
特点:
(1). 有一个特殊的结点(最上面的根,整个树的根),称为根结点,根结点没有前驱结点
(2).  除根结点外,其余结点被分成M(M > 0)个互不相交的集合T1、T2、......、Tm,其中每一个集合Ti (1 <= i <=m) 又是一棵与树类似的子树每棵子树的根结点有且只有一个前驱,可以有0个或多个后继
 
(3). 树是递归定义的
注意:
(1). 树形结构中,子树之间不能有交集,否则就不是树形结构
(2).出了根节点外,每一个节点有且只有一个父节点
(3). N个节点的树有(N-1)条条边。
                                  
结点的度 一个结点含有子树的个数称为该结点的度
树的度 一棵树中,所有结点度的最大值称为树的度;
叶子结点或终端结点 度为0的结点称为叶结点; 
双亲结点或父结点 若一个结点含有子结点,则这个结点称为其子结点的父结点;
孩子结点或子结点 一个结点含有的子树的根结点称为该结点的子结点;
根结点 一棵树中,没有双亲结点的结点;
结点的层次 从根开始定义起,根为第1层,根的子结点为第2层,以此类推
树的高度或深度 树中结点的最大层次
下面的了解即可:
非终端结点或分支结点 度不为0的结点
兄弟结点 具有相同父结点的结点互称为兄弟结点。
堂兄弟结点双亲在同一层的结点互为堂兄弟
结点的祖先从根到该结点所经分支上的所有结点。
子孙以某结点为根的子树中任一结点都称为该结点的子孙。所有结点都是整个树的根节点的子孙
森林由m(m>=0)棵互不相交的树组成的集合称为森林
2.树的应用
文件系统管理(目录和文件)
二. 二叉树概念及特性:
1. 概念:
一棵二叉树是结点的一个有限集合,该集合:
(1) 或者为空
(2) 或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。
特点:
(1)二叉树 不存在度大于2的结点
(2)二叉树的 子树有左右之分,次序不能颠倒,因此二叉树是有序树
2 两种特殊的二叉树:
(1) 满二叉树:
一棵二叉树,如果每层的结点数都达到最大值(就是每个节点度都等于2),则这棵二叉树就是满二叉树
 
公式定义:也就是说,如果一棵二叉树的层数为K,且结点总数(2^k - 1)(2的K次方减一),则它就是满二叉树
如图:
(2)完全二叉树:
完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n 个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从0至n-1的结点一一对应时称之为 完全二叉树。
满二叉树是一种特殊的完全二叉树。
我的理解: (二叉树的节点从上到下从左到右按序号一次存放不间断)
图解:
                                                                     
  
3.  二叉树的性质
(1). 若规定根结点的层数为1,则一棵非空二叉树的第i层上最多有(2的i次方减一)
(i>0)个结点
(2). 若规定只有根结点的二叉树的深度为1,则深度为K的二叉树的最大结点数是
(k>=0)
(3). 对任何一棵二叉树, 如果其叶结点个数为 n0, 度为2的非叶结点个数为 n2,则有n0=n2+1
(度为0的节点比度为2的节点多一个):
推导如图:
            
(4). 具有n个结点的完全二叉树的深度k为,(log2 N+1,log2为底,N+1次方)上取整
(5). 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的顺序对所有节点从0开始编号,则对于序号为i 的结点有:
i>0双亲序号:(i-1)/2i=0i为根结点编号,无双亲结点
2i+1<n,左孩子序号:2i+1,否则无左孩子
2i+2<n,右孩子序号:2i+2,否则无右孩子
4 二叉树的存储:
二叉树的存储结构分为:顺序存储类似于链表的链式存储
二叉树的链式存储是通过一个一个的节点引用起来的,常见的表示方式有二叉和三叉表示方式
具体如下:
// 孩子表示法
class Node {
int val; // 数据域
Node left; // 左孩子的引用,常常代表左孩子为根的整棵左子树
Node right; // 右孩子的引用,常常代表右孩子为根的整棵右子树
}
// 孩子双亲表示法
class Node {
int val; // 数据域
Node left; // 左孩子的引用,常常代表左孩子为根的整棵左子树
Node right; // 右孩子的引用,常常代表右孩子为根的整棵右子树
Node parent; // 当前节点的根节点
}
孩子双亲表示法后序在平衡树位置介绍,本页博客采用孩子表示法来构建二叉树
三. 二叉树的基本操作(与遍历相关):
1.这里重点写一下二叉树的遍历方法:
前序遍历——访问根结点--->根的左子树--->根的右子树。
中序遍历——根的左子树--->根节点--->根的右子树。
后序遍历——根的左子树--->根的右子树--->根节点。
下面一些关于二叉树的方法的代码,主要是熟悉,递归和熟悉二叉树的遍历:
(1)前序遍历及前序子问题遍历:
图解:
// 前序遍历void preOrder(TreeNode root) {//结束条件if (root == null) {return;}//相当于递推公式:根 左树 右树System.out.print(root.val + " ");preOrder(root.left);preOrder(root.right);}//子问题思路前序遍历List preOrder2(TreeNode root) {//定义一个顺序表,每次递归,把递归的返回值放入顺序表List<Character> list = new ArrayList<>();//结束条件if (root == null) {return list;}list.add(root.val);List<Character> leftTree = preOrder2(root.left);list.addAll(leftTree);//返回时,把前一个左树放入顺序表中List<Character> rightTree = preOrder2(root.right);list.addAll(rightTree);//返回时,把前一个右树放入顺序表中return list;}

(2)后序中序遍历:

// 中序遍历void inOrder(TreeNode root) {//结束条件if (root == null) {return;}//相当于递推公式:左树 根 右树inOrder(root.left);System.out.print(root.val + " ");inOrder(root.right);}// 后序遍历void postOrder(TreeNode root) {//结束条件if (root == null) {return;}//相当于递推公式: 右树 左树 根postOrder(root.left);postOrder(root.right);System.out.print(root.val + " ");}

(3)获得二叉树节点个数:

//遍历二叉树获得节点个数public static int nodeSize;public void size(TreeNode root) {if (root == null) {return;}nodeSize++;//递归遍历size(root.left);size(root.right);}//子问题思路二叉树获得节点个数//方法:左子树节点 + 右子树节点 + 1; '1'为概树第1个根节点public int size2(TreeNode root) {if (root == null) {return 0;}//树不为空,左子树节点 + 右子树节点 + 1return  size2(root.left) +size2(root.right) + 1;}

(4)获取叶子节点个数:

//获取叶子节点个数//遍历方法public static int NodeCount;public void getLeafNodeCount(TreeNode root) {if (root == null) {return;}//节点左右两节点都为null时,就是叶子结点if (root.left == null && root.right == null) {NodeCount++;}//有一边树不为空就递归遍历getLeafNodeCount(root.left);getLeafNodeCount(root.right);}//子问题方法public int getLeafNodeCount2(TreeNode root) {if (root == null) {return 0;}//节点左右两节点都为null时,就是叶子结点if (root.left == null && root.right == null) {return 1;}//方法:递归的方式,左叶子节点 + 右叶子节点/*这里递归时,满足叶子节点就会,return 上面的 1 给这个递归函数,最后返回叶子节点个数*/return getLeafNodeCount2(root.left) +getLeafNodeCount2(root.right);}

(5)二叉树的高度 :

图解:

//求第K层节点树/** 子问题方法:左边第k-1节点,加右边第K-1结点;*            因为二叉树每遍历一层就会,往下走一层,就是k的值就 减一*             当k1==1时就到了第K层*/public int getKLeveNodeCount(TreeNode root, int k) {if (root == null) {return 0;}//返回条件是,k == 1就到了第K层;返回节点数if (k == 1) {return 1;}return getKLeveNodeCount(root.left, k-1) +getKLeveNodeCount(root.right, k-1);}

(6)找到指定的val 树:

图解:

public TreeNode findVal(TreeNode root, char val) {if (root == null) {return null;}//返回的条件是,找到val树。//根遍历if (root.val == val) {return root;}//遍历左树,找valTreeNode leftT = findVal(root.left, val);if (leftT != null) {return leftT;}//遍历右树,找valTreeNode rightT = findVal(root.right, val);if (rightT != null) {return rightT;}return null;}

还有两个:设计层序和判断一棵树是不是完全二叉树的方法,请听下回分解

                                                                          

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/47740.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构之初始二叉树(4)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构&#xff08;Java版&#xff09; 二叉树的基本操作 二叉树的相关刷题&#xff08;上&#xff09;通过上篇文章的学习&#xff0c;我们…

queue的模拟实现【C++】

文章目录 全部的实现代码放在了文章末尾什么是适配器模式&#xff1f;准备工作包含头文件定义命名空间类的成员变量 默认成员函数emptysizefrontbackpushpop全部代码 全部的实现代码放在了文章末尾 queue的模拟实现和stack一样&#xff0c;采用了C适配器模式 queue的适配器一…

Java生成四位纯数字并且确保唯一性

背景&#xff1a; 给了我一个需求&#xff0c;由于某些问题原因&#xff0c;需要给属性和数据添加一个code字段&#xff0c;这是给我发的消息 这两个要求其实是同一个需求&#xff0c;就是在创建对象的时候塞入一个unique的code嘛&#xff0c;听起来很简单吧&#xff0c;但是实…

GooglePlay 金融品类政策更新(7月17号)

距离上次政策大更新&#xff08;4月5号&#xff09;才过去了3个月&#xff0c;Google Play又迎来了一次大更新&#xff0c;不得不说Google Play的要求越来越高了。 我们来梳理一下这次GooglePlay针对金融品类更新了哪些政策: 1.要求提供金融产品和服务的开发者必须注册为组织…

Window环境下MySQL管理

1、MySQL服务启用和停止 图形化界面管理 使用键盘组合键&#xff08;Win R&#xff09;打开运行对话框&#xff0c;在对话框中输入services.msc并点击确定。 这里可以看到服务名称为MySQL84并处于正在运行的状态。 选中后右键可以进行暂停、停止、重启等操作。 命令提示符管理…

OpenCV 直方图概念,直方图均衡化原理详解

文章目录 直方图相关概念颜色灰度级作用应用场景 C 使用OpenCV绘制直方图单通道直方图关键代码分析&#xff1a;calcHist函数分析使用OpenCV API来绘制直方图 效果图&#xff1a; 彩色三通道直方图效果图&#xff1a; 直方图均衡化概念均衡化作用均衡化效果均衡化数学原理步骤数…

Linux中进程间通信--匿名管道和命名管道

本篇将会进入 Linux 进程中进程间通信&#xff0c;本篇简要的介绍了 Linux 中进程为什么需要通信&#xff0c;进程间通信的常用方式。然后详细的介绍了 Linux 进程间的管道通信方式&#xff0c;管道通信分为匿名管道和命名管道&#xff0c;本篇分别介绍了其实现的原理&#xff…

基于VMware(虚拟机) 创建 Ubunton24.04

目录 1.设置 root 密码 2. 防火墙设置 2.1 安装防火墙 2.2 开启和关闭防火墙 2.3 开放端口和服务规则 2.4 关闭端口和删除服务规则 2.5 查看防火墙状态 3. 换源 3.1 源文件位置 3.2 更新软件包 1. 设置网络 1. 在安装ubuntu时设置网络 2.在配置文件中修改 2.设置 r…

17_高级进程间通信 UNIX域套接字1

非命名的UNIX域套接字 第1个参数domain&#xff0c;表示协议族&#xff0c;只能为AF_LOCAL或者AF_UNIX&#xff1b; 第2个参数type&#xff0c;表示类型&#xff0c;只能为0。 第3个参数protocol&#xff0c;表示协议&#xff0c;可以是SOCK_STREAM或者SOCK_DGRAM。用SOCK_STR…

HTTP 缓存

缓存 web缓存是可以自动保存常见的文档副本的HTTP设备&#xff0c;当web请求抵达缓存时&#xff0c;如果本地有已经缓存的副本&#xff0c;就可以从本地存储设备而不是从原始服务器中提取这个文档。使用缓存有如下的优先。 缓存减少了冗余的数据传输缓存环节了网络瓶颈的问题…

MySQL学习之InnoDB引擎,索引

Mysql中的引擎 我们先来看一下MySql提供的有哪些引擎 mysql> show engines; 从上图我们可以查看出 MySQL 当前默认的存储引擎是InnoDB,并且在5.7版本所有的存储引擎中只有 InnoDB 是事务性存储引擎&#xff0c;也就是说只有 InnoDB 支持事务。 查看MySQL当前默认的存储引…

算法力扣刷题记录 五十一【654.最大二叉树】

前言 二叉树篇&#xff0c;继续。 记录 五十一【654.最大二叉树】 一、题目阅读 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。…

套接字编程一(简单的UDP网络程序)

文章目录 一、 理解源IP地址和目的IP地址二、 认识端口号1. 理解 "端口号" 和 "进程ID"2. 理解源端口号和目的端口号 三、 认识协议1. 认识TCP协议2. 认识UDP协议 四、 网络字节序五、 socket编程接口1. socket 常见API2. sockaddr结构&#xff08;1&#…

WebGIS的Web服务概述

WebGIS是互联网技术应用于GIS开发的产物&#xff0c;是现代GIS技术的重要组成部分&#xff0c;其中的Web服务是现代WebGIS的核心技术和重要标志&#xff0c;它集GIS、程序组件和互联网的优点于一身&#xff0c;深刻改变了GIS开发和应用的方式&#xff0c;绕过了本地数据转换和本…

Unity 批处理详讲(含URP)

咱们在项目中&#xff0c;优化性能最重要的一个环节就是合批处理&#xff0c;&#xff0c;在早期Unity中&#xff0c;对于合批的处理手段主要有三种&#xff1a; Static Batching Dynamic Batching GPU Instancing 如今Unity 为了提升合批范围与效率&#xff0c;提供了…

ICT测试原理

目录&#xff1a; 一、什么是ICT 二、ICT在哪使用 三、ICT如何测试 1、隔离(Guarding)原理 2、电容器测试原理 3、电感器测试原理 4、普通二极管测试方法(MODE D) 5、晶体管的测量原理 (三端点)(MODE TR) 6、短/开路的测试原理 1&#xff09;学习短路表 2&#xff…

基于chrome插件的企业应用

一、chrome插件技术介绍 1、chrome插件组件介绍 名称 职责 访问权限 DOM访问情况 popup 弹窗页面。即打开形式是通过点击在浏览器右上方的icon&#xff0c;一个弹窗的形式。 注: 展示维度 browser_action:所有页面 page_action:指定页面 可访问绝大部分api 不可以 bac…

【数据结构】排序算法——Lessen1

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

【动态专修】2024年五菱维修手册和电路图资料更新

经过整理&#xff0c;2017-2024年五菱汽车全系列已经更新至汽修帮手资料库内&#xff0c;覆盖市面上99%车型&#xff0c;包括维修手册、电路图、新车特征、车身钣金维修数据、全车拆装、扭力、发动机大修、发动机正时、保养、电路图、针脚定义、模块传感器、保险丝盒图解对照表…

人、智能、机器人……

在遥远的未来之城&#xff0c;智能时代如同晨曦般照亮了每一个角落&#xff0c;万物互联&#xff0c;机器智能与人类智慧交织成一幅前所未有的图景。这座城市&#xff0c;既是科技的盛宴&#xff0c;也是人性与情感深刻反思的舞台。 寓言&#xff1a;《智光与心影》 在智能之…