Java数据结构二叉树

概念

一棵二叉树是结点的一个有限集合,该集合:
1. 或者为空
2. 或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。

从上图可以看出:
1. 二叉树不存在度大于2的结点
2. 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树
注意:对于任意的二叉树都是由以下几种情况复合而成的:

大自然的奇观:

两种特殊的二叉树
 

1. 满二叉树:
如果每层的结点数都达到最大值,则这棵二叉树就是满二叉树。也就是说,如果一棵
二叉树的层数为K,且结点总数是 ,则它就是满二叉树。

2. 完全二叉树:
从上到下,从左到右依次。

要注意的是满二叉树是一种特殊的完全二叉树。
 

二叉树的性质

3. 对任何一棵二叉树, 如果其叶结点个数为 n0, 度为2的非叶结点个数为 n2,则有n0=n2+1
度为0的节点会比度为2的节点多一个

5. 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的顺序对所有节点从0开始编号,则对于序号为i的结点有:
若i>0,双亲序号:(i-1)/2;i=0,i为根结点编号,否则无双亲结点
若2i+1<n,左孩子序号:2i+1,否则无左孩子
若2i+2<n,右孩子序号:2i+2,否则无右孩子

1. 某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为( )
A 不存在这样的二叉树
B 200
C 198
D 199


2.在具有 2n 个结点的完全二叉树中,叶子结点个数为( )
A n
B n+1
C n-1
D n/2


3.一个具有767个节点的完全二叉树,其叶子节点个数为()
A 383
B 384
C 385
D 386


4.一棵完全二叉树的节点数为531个,那么这棵树的高度为( )
A 11
B 10
C 8
D 12


答案:
1.B
2.A
3.B
4.B

二叉树的存储
 

二叉树的存储结构分为:顺序存储和类似于链表的链式存储
顺序存储在下节介绍。
二叉树的链式存储是通过一个一个的节点引用起来的,常见的表示方式有二叉和三叉表示方式,具体如下:

// 孩子表示法
class Node {

int val;
Node left;
// 数据域
// 左孩子的引用,常常代表左孩子为根的整棵左子树
Node right; // 右孩子的引用,常常代表右孩子为根的整棵右子树
}
// 孩子双亲表示法
class Node {
int val;
Node left;
// 数据域
// 左孩子的引用,常常代表左孩子为根的整棵左子树

Node right; // 右孩子的引用,常常代表右孩子为根的整棵右子树
Node parent; // 当前节点的根节点
}

孩子双亲表示法后序在平衡树位置介绍,本文采用孩子表示法来构建二叉树。

二叉树的基本操作

二叉树的遍历

下面主要分析前序递归遍历,中序与后序图解类似,可自己动手绘制。

前序遍历结果:1 2 3 4 5 6
中序遍历结果:3 2 1 5 4 6
后序遍历结果:3 1 5 6 4 1


层序遍历

前置说明
 

在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。由于现在大家对二叉树结构掌握还不够深入,为了降低大家学习成本,此处手动快速创建一棵简单的二叉树,快速进入二叉树操作学习,等二叉树结构了解的差不多时,我们反过头再来研究二叉树真正的创建方式。

public class TestBinaryTree {static class TreeNode {public char val;public TreeNode left;public TreeNode right;public TreeNode(char val) {this.val = val;}}public TreeNode createTree() {TreeNode A = new TreeNode('A');TreeNode B = new TreeNode('B');TreeNode C = new TreeNode('C');TreeNode D = new TreeNode('D');TreeNode E = new TreeNode('E');TreeNode F = new TreeNode('F');TreeNode G = new TreeNode('G');TreeNode H = new TreeNode('H');A.left = B;A.right = C;B.left = D;B.right = E;C.left = F;C.right = G;E.right = H;return A;}// 前序遍历void preOrder(TreeNode root) {if (root == null) {return;}System.out.print(root.val + " ");//递归遍历左子树preOrder(root.left);//递归遍历右子树preOrder(root.right);}// 中序遍历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 + " ");}}
public class Test {public static void main(String[] args) {TestBinaryTree testBinaryTree=new TestBinaryTree();TestBinaryTree.TreeNode root=testBinaryTree.createTree();testBinaryTree.preOrder(root);System.out.println();testBinaryTree.inOrder(root);System.out.println();testBinaryTree.postOrder(root);System.out.println();}
}


注意:上述代码并不是创建二叉树的方式,真正创建二叉树方式后序详解重点讲解。

1.某完全二叉树按层次输出(同一层从左到右)的序列为 ABCDEFGH 。该完全二叉树的前序序列为()
A: ABDHECFG    B: ABCDEFGH    C: HDBEAFCG    D: HDEBFGCA


2.二叉树的先序遍历和中序遍历如下:先序遍历:EFHIGJK;中序遍历:HFIEJKG.则二叉树根结点为()
A: E    B: F    C: G    D: H

上难度:画出这棵树 并且求出后序遍历


3.设一课二叉树的中序遍历序列:badce,后序遍历序列:bdeca,则二叉树前序遍历序列为()
A: adbce    B: decab    C: debac    D: abcde


4.某二叉树的后序遍历序列与中序遍历序列相同,均为 ABCDEF ,则按层次输出(同一层从左到右)的序列为()
A: FEDCBA    B: CBAFED    C: DEFCBA    D: ABCDEF


【参考答案】 1.A    2.A    3.D    4.A

二叉树的基本操作

    //子问题思路//获取树中节点的个数(左子树节点个数+右子树节点个数+1=整棵树的节点个数)public int size(TreeNode root) {if (root == null) {return 0;}int ret = size(root.left) + size(root.right) + 1;return ret;}public static int nodeSize;//遍历思路public void size2(TreeNode root) {if (root == null) {return;}nodeSize++;size2(root.left);size2(root.right);}// 获取叶子节点的个数//子问题的思路(整颗树的叶子节点个数=左子树的叶子节点+右子树的叶子节点)int getLeafNodeCount(TreeNode root) {if (root == null) {return 0;}if (root.left == null && root.right == null) {return 1;}return getLeafNodeCount(root.right) + getLeafNodeCount(root.right);}//遍历思路:以某种方式遍历这棵树,只要发现是叶子就++public int leafSize;public void getLeafNodeCount2(TreeNode root) {if (root == null) {return;}if (root.left == null && root.right == null) {leafSize++;}getLeafNodeCount(root.left);getLeafNodeCount(root.right);}// 获取第K层节点的个数int getKLevelNodeCount(TreeNode root, int k) {if (root == null) {return 0;}if (k == 1) {return 1;}return getKLevelNodeCount(root.left, k - 1) + getKLevelNodeCount(root.right, k - 1);}// 获取二叉树的高度(整棵树的高度=Math.max(左树高度+右树高度)+1)int getHeight(TreeNode root) {if (root == null) {return 0;}int leftHeight = getHeight(root.left);int rightHeight = getHeight(root.right);return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1;}// 检测值为value的元素是否存在TreeNode find(TreeNode root, int val) {if (root == null) {return null;}if (root.val == val) {return root;}TreeNode ret = find(root.left, val);if (ret != null) {return ret;}ret = find(root.right, val);if (ret != null) {return ret;}return null;}

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

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

相关文章

医疗器械FDA | 常见的网络安全材料发补问题都有哪些?

FDA网络安全资料发补咨询点此​​获取https://work.weixin.qq.com/ca/cawcde5ee29d239046 ————————--- 01 安全文档编写问题 FDA网络安全文档编写格式、内容、可读性等未满足官方要求&#xff0c;则将可能被要求发补整改编写后的文档。 02 安全管理问题 a. 网络安…

【机器学习】K-means聚类算法:原理、应用与优化

一、引言 1、简述聚类分析的重要性及其在机器学习中的应用 聚类分析&#xff0c;作为机器学习领域中的一种无监督学习方法&#xff0c;在数据探索与知识发现过程中扮演着举足轻重的角色。它能够在没有先验知识或标签信息的情况下&#xff0c;通过挖掘数据中的内在结构和规律&a…

深度学习学习日记4.7

1.梯度下降 w 新 w旧 - 学习率梯度 训练的目的就是让 loss 减小 2.前向传播进行预测&#xff0c; 反向传播进行训练(每一个参数通过梯度下降进行更新参数)&#xff0c;(1前向传播 2求 loss 3反向传播 4梯度更新) 能够让损失下降的参数&#xff0c;就是更好的参数。 损失…

数据分析-数据清洗8大类方法|数据采集|电商数据API接口

数据分析首先我们需要坐数据采集 jd API 接入说明 API地址: 调用示例&#xff1a; 参数说明 通用参数说明 url说明 ……/平台/API类型/ 平台&#xff1a;淘宝&#xff0c;京东等&#xff0c; API类型:[item_search,item_get,item_search_shop等]version:API版本key:调用key,…

阿里云微调chatglm3-6b---只有一个python解释器但gradio要求版本不兼容怎么办

安装LLAMA参考博文http://t.csdnimg.cn/6yYwG 在用LLAMA微调大模型的时候总是出现connected error out并且出现这样的界面 这是由于LLMA所要求的gradio版本>4.0.0,<4.2.0&#xff0c;然而chatglm3-6b要求的gradio版本需要gradio3.39.0才能显示出web_demo_gradio.py渲染…

C++反向迭代器的实现

一、反向迭代器的定义 在容器中从尾元素向首元素反向移动的迭代器 对于反向迭代器&#xff0c;递增和递减的含义会颠倒过来 递增一个反向迭代器会移动到前一个元素 递减一个迭代器会移动到下一个元素 二、反向迭代器的实现 // 适配器 -- 复用 template<class Iterator,…

Weblogic任意文件上传漏洞(CVE-2018-2894)漏洞复现(基于vulhub)

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

数据库安全(二),3天拿到网易网络安全岗offer

数据脱敏厂家 国外&#xff1a;Informatica国内&#xff1a;比特信安、美创、安华、神州数码 由于敏感数据的重要性以及特殊性&#xff0c;一般不建议使用国外产品。 数据库漏扫 又叫数据库安全评估系统 漏扫对象 DBMS脆弱点&#xff1a;已知的DBMS自身存在的漏洞弱口令缺…

力扣HOT100 - 160. 相交链表

解题思路&#xff1a; /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) {* val x;* next null;* }* }*/ public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {if…

笔记本会不会自动升级win11,win10会自动升级到win11吗

众所周知,win11是微软新推出的pc端操作系统,从发布到现在也有一年的时间了,不少用户想要安装使用。但是问题来了,笔记本会不会自动升级win11呢?答案是,并不会自动更新,如果你是正版win10系统,可以通过收到的升级通知进行升级win11。 win10会自动升级到win11吗 升级win1…

批量修改文件名后缀,支持自定义重命名并更改扩展名,高效管理文件

你是否曾经因为需要修改大量文件的扩展名而头疼不已&#xff1f;手动一个个修改&#xff0c;既耗时又容易出错。现在&#xff0c;有了这款批量修改文件名后缀的神器&#xff0c;只需一键操作&#xff0c;即可轻松完成所有文件的扩展名修改。无论是图片、文档、视频还是音频&…

关于QEMU模拟器本身以及和CXL功能模拟相关内容的学习

前言&#xff1a;在写Paper的时候&#xff0c;发现直接引用QEMU官网关于QEMU的介绍实在是一个图省事儿的方法&#xff0c;但是并不可取。即使是一小段&#xff0c;也要去真正了解QEMU的基本原理&#xff0c;如何实现功能模拟&#xff0c;以及目前实现的与CXL相关的内容。 注&am…

成功的环保企业:四大核心能力的深度剖析|中联环保圈

在追求可持续发展的道路上&#xff0c;环保企业不仅承载着社会责任&#xff0c;还要面对市场的考验。为了在激烈的竞争中脱颖而出&#xff0c;环保企业需要练就四大基本功&#xff1a;挣钱、要钱、省钱和花钱。这四大能力相互关联&#xff0c;共同构成了企业稳健运营的基石&…

Web 前端性能优化之七:数据存储与缓存技术

7、数据存储 在开发Web应用的过程中&#xff0c;会涉及一些数据的存储需求&#xff0c;常见的存储方式可能有&#xff1a; 保存登录态的Cookie&#xff1b; 使用浏览器本地存储进行保存的Local Storage和Session Storage&#xff1b; 客户端数据持久化存储方案涉及的Web SQ…

关于MCU产品开发参数存储的几种方案

关于MCU产品开发参数存储的几种方案 Chapter1 关于MCU产品开发参数存储的几种方案Chapter2 单片机参数处理[保存与读取]Chapter3 嵌入式设备参数存储技巧Chapter4 STM32硬件I2C的一点心得(AT24C32C和AT24C64C) Chapter1 关于MCU产品开发参数存储的几种方案 原文链接 在工作中…

【随笔】Git 高级篇 -- 纠缠不清的分支 rebase | cherry-pick(二十四)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

位图布隆过滤器的原理及实现

目录 位图的概念&#xff1a; 位图的前置知识&#xff1a;位运算 位图的实现&#xff1a; 位图的基本参数和构造方法&#xff1a; 位图的插入&#xff1a; 位图的查找&#xff1a; 位图的删除&#xff1a; 布隆过滤器概念&#xff1a; 布隆过滤器的实现&#xff1a; …

TI-ST论文速读

Domain Adaptation for Medical Image Segmentation Using Transformation-Invariant Self-training 摘要 能够利用未标记数据的模型对于克服不同成像设备和配置中获取的数据集之间的巨大分布差距至关重要。在这方面&#xff0c;基于伪标记的自训练技术已被证明对半监督域适应…

微商商城源码小程序好用么?

商城APP作为电子商务行业的重要组成部分&#xff0c;已经成为了人们购物的主要方式之一。为了在竞争激烈的市场中脱颖而出&#xff0c;开发一款专业且思考深度的商城APP方案显得尤为关键。本文将从专业性和思考深度两个方面&#xff0c;探讨商城APP的开发方案。 一、专业性的重…

HTML+CSS+JS实现京东首页[web课设代码+模块说明+效果图]

系列文章目录 Web前端大作业htmlcss静态页面–掌****有限公司 Web前端大作业起点小说静态页面 Web前端大作业网易云页面 Web前端大作业商城页面 Web前端大作业游戏官网页面 Web前端大作业网上商城页面 HTMLCSS淘宝首页[web课设代码模块说明效果图] 文章目录 系列文章目录前言一…