九、二叉树
创始人
2024-05-29 17:58:00
0

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

自学JAVA数据结构笔记,跟学视频为:黑马程序员Java数据结构与java算法全套教程,数据结构+算法教程全资料发布,包含154张java数据结构图_哔哩哔哩_bilibili


提示:以下是本篇文章正文内容,下面案例可供参考

一、树的基本定义

1.含义

树是我们计算机中非常重要的一种数据结构,同时使用树这种数据结构,可以描述现实生活中的很多事物,例如家 谱、单位的组织架构、等等。

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

2.特点

树具有以下特点:

1.每个结点有零个或多个子结点;

2.没有父结点的结点为根结点;

3.每一个非根结点只有一个父结点;

4.每个结点及其后代结点整体上可以看做是一棵树,称为当前结点的父结点的一个子树;

二、树的相关术语

结点的度:

一个结点含有的子树的个数称为该结点的度;

叶结点:

度为0的结点称为叶结点,也可以叫做终端结点

分支结点:

度不为0的结点称为分支结点,也可以叫做非终端结点

结点的层次:

从根结点开始,根结点的层次为1,根的直接后继层次为2,以此类推

结点的层序编号:

将树中的结点,按照从上层到下层,同层从左到右的次序排成一个线性序列,把他们编成连续的自然数。

树的度:

树中所有结点的度的最大值

树的高度(深度):

树中结点的最大层次

森林:

m(m>=0)个互不相交的树的集合,将一颗非空树的根结点删去,树就变成一个森林;给森林增加一个统一的根 结点,森林就变成一棵树

三、二叉查找树的创建

1.结点类

结点类API设计:

类名                 Node

构造方法         Node(Key key, Value value, Node left, Node right):创建Node对象

成员变量         1.public Node left:记录左子结点

                        2.public Node right:记录右子结点

                        3.public Key key:存储键

                        4.public Value value:存储值

代码实现: 

private class Node{//存储键public Key key;//存储值private Value value;//记录左子结点public Node left;//记录右子结点public Node right;public Node(Key key, Value value, Node left, Node right) {this.key = key;this.value = value;this.left = left;this.right = right;}
}

 2. 二叉查找树

二叉查找树API设计:

类名                 BinaryTree,Value value>

构造方法         BinaryTree():创建BinaryTree对象

成员变量         1.private Node root:记录根结点

                        2.private int N:记录树中元素的个数

成员方法         1. public void put(Key key,Value value):向树中插入一个键值对

                        2.private Node put(Node x, Key key, Value val):给指定树x上,添加键一个键值对,并返回添 加后的新树

                        3.public Value get(Key key):根据key,从树中找出对应的值

                        4.private Value get(Node x, Key key):从指定的树x中,找出key对应的值                         5.public void delete(Key key):根据key,删除树中对应的键值对

                        6.private Node delete(Node x, Key key):删除指定树x上的键为key的键值对,并返回删除后的新树

                        7.public int size():获取树中元素的个数

 二叉查找树实现:

package BinaryTree;public class BinaryTree, Value> {//记录根结点private Node root;//记录树中元素的个数private int N;//获取树中元素的个数public int size() {return N;}//向树中添加元素key-valuepublic void put(Key key, Value value) {root = put(root, key, value);}//向指定的树x中添加key-value,并返回添加元素后新的树private Node put(Node x, Key key, Value value) {//当跟结点为空if (x == null) {//个数+1N++;return new Node(key, value, null, null);}//比较数int cmp = key.compareTo(x.key);if (cmp > 0) {//新结点的key大于当前结点的key,继续找当前结点的右子结点x.right = put(x.right, key, value);} else if (cmp < 0) {//新结点的key小于当前结点的key,继续找当前结点的左子结点x.left = put(x.left, key, value);} else {//新结点的key等于当前结点的key,把当前结点的value进行替换x.value = value;}return x;}//查询树中指定key对应的valuepublic Value get(Key key) {return get(root, key);}//从指定的树x中,查找key对应的值public Value get(Node x, Key key) {if (x == null) {return null;}int cmp = key.compareTo(x.key);if (cmp > 0) {//如果要查询的key大于当前结点的key,则继续找当前结点的右子结点;return get(x.right, key);} else if (cmp < 0) {//如果要查询的key小于当前结点的key,则继续找当前结点的左子结点;return get(x.left, key);}else {//如果要查询的key等于当前结点的key,则树中返回当前结点的value。return x.value;}}//删除树中key对应的valuepublic void delete(Key key) {root = delete(root, key);}//删除指定树x中的key对应的value,并返回删除后的新树public Node delete(Node x, Key key) {if (x == null) {return null;}int cmp = key.compareTo(x.key);if (cmp > 0) {//新结点的key大于当前结点的key,继续找当前结点的右子结点x.right = delete(x.right, key);} else if (cmp < 0) {//新结点的key小于当前结点的key,继续找当前结点的左子结点x.left = delete(x.left, key);} else {//新结点的key等于当前结点的key,当前x就是要删除的结点//1.如果当前结点的右子树不存在,则直接返回当前结点的左子结点if (x.right == null) {return x.left;}//2.如果当前结点的左子树不存在,则直接返回当前结点的右子结点if (x.left == null) {return x.right;}//3.当前结点的左右子树都存在//3.1找到右子树中最小的结点Node minNode = x.right;while (minNode.left != null) {minNode = minNode.left;}//3.2删除右子树中最小的结点Node n = x.right;while (n.left != null) {if (n.left.left == null) {n.left = null;} else {n = n.left;}}//3.3让被删除结点的左子树称为最小结点minNode的左子树,让被删除结点的右子树称为最小结点minNode的右子树minNode.left = x.left;minNode.right = x.right;//3.4让被删除结点的父节点指向最小结点minNodex = minNode;//个数-1N--;}return x;}private class Node {//存储键public Key key;//存储值private Value value;//记录左子结点public Node left;//记录右子结点public Node right;public Node(Key key, Value value, Node left, Node right) {this.key = key;this.value = value;this.left = left;this.right = right;}}
}

总结

提示:这里对文章进行总结:
 

相关内容

热门资讯

王者定位怎么关安卓系统,轻松实... 你是不是也和我一样,对王者荣耀这款游戏爱得深沉呢?不过,有时候游戏里的设置让人头疼,比如安卓系统的王...
树莓派安卓系统流畅,打造便携式... 亲爱的读者们,你是否曾想过,将树莓派与安卓系统结合,会擦出怎样的火花呢?今天,就让我带你一起探索这个...
安卓系统智能机顶盒,引领家庭娱... 你有没有想过,家里的电视也能变得智能起来?没错,就是那个陪伴我们多年的老电视,现在也能摇身一变,成为...
安卓系统很差了吗现在,性能优劣... 最近是不是有不少朋友在讨论安卓系统的问题呢?有人说它越来越差了,也有人觉得它还是那个熟悉的“老朋友”...
安卓系统uc安装包,Andro... 你有没有发现,手机里的安卓系统越来越强大了?今天,咱们就来聊聊这个话题——安卓系统中的UC安装包。你...
安卓系统谷歌能删吗,谷歌能否删... 你有没有想过,那个一直陪伴你手机生活的安卓系统,它背后的谷歌爸爸,是不是也能被你随意删掉呢?这可不是...
安卓系统会不会更耗电,解析其功... 你有没有发现,手机用着用着,电池就有点不给力了?尤其是那些用安卓系统的手机,有时候感觉电就像流水一样...
安卓系统中无效目录,安卓系统无... 你有没有遇到过在安卓系统中,明明文件夹就在那里,但是就是找不到的情况?别急,今天就来给你揭秘安卓系统...
国产安卓机哪个系统好用,探寻最... 你有没有想过,国产安卓机哪个系统最好用呢?这可是个让人纠结的问题,毕竟每个系统都有它的特色和亮点。今...
安卓系统cpua9,引领性能与... 你有没有发现,最近你的安卓手机运行得是不是比以前顺畅多了?这可多亏了那个强大的安卓系统CPUA9啊!...
安卓系统usb驱动程序,功能、... 你有没有遇到过这种情况:手机里存了那么多宝贝照片和视频,想传输到电脑上保存,结果电脑却像个小顽皮,死...
安卓操作系统怎么关闭,轻松关闭... 手机里的安卓操作系统是不是有时候让你觉得有点儿烦呢?别急,今天就来手把手教你如何轻松关闭安卓操作系统...
追星手机壳推荐安卓系统,盘点热... 你有没有发现,现在追星族们对手机壳的热爱简直到了疯狂的地步?没错,就是那种能让你一秒变身偶像迷妹的手...
ios系统用安卓系统游戏下载软... 你有没有想过,明明是iOS系统的手机,却想玩安卓系统的游戏?这可不是什么天方夜谭,现在就有这么神奇的...
安卓高系统怎么用美化,打造专属... 亲爱的安卓用户们,你是不是也和我一样,对手机系统美化情有独钟呢?想要让你的安卓手机焕然一新,变得个性...
安卓系统怎么开夜间模式,安卓系... 亲爱的手机控们,你是不是在夜晚使用安卓手机时,眼睛感到有些不适?别担心,今天我要给你揭秘一个超级实用...
王者安卓系统用苹果人脸,一场视... 你知道吗?最近在手机圈里可是掀起了一股不小的波澜呢!那就是王者安卓系统竟然用上了苹果人脸识别技术!是...
安卓444怎么升级系统,轻松迈... 你那安卓444的小家伙是不是已经有点儿落伍了?别急,今天就来给你详细说说怎么给它来个系统升级,让它焕...
安卓系统raw修图软件,探索安... 你有没有发现,手机拍照越来越方便了,但有时候拍出来的照片还是不够完美呢?别急,今天就来给你安利几款安...
安卓系统的王者切换苹果,从安卓... 你知道吗?最近身边的朋友圈里掀起了一股热潮,那就是安卓系统的王者们纷纷切换到苹果阵营。这可真是让人大...