Java树形结构的解释和用法

Java树形结构是一种可以存储元素的有层级关系的数据结构,每个元素以节点的形式存在,并且一个根节点会关联多个子节点,子节点再关联更多的子节点,以此类推。

一、树的基本概念

1、树形结构是一种递归式数据结构,它包括一个值,同时还可能包括指向其他树的引用(树是由节点(储存元素)和边(连接节点)组成的集合)

2、树形结构的特性如下: 每个节点有零个或多个子节点; 没有父节点的节点称为根节点; 每一个非根节点有且只有一个父节点; 除了根节点外,每个子节点又可以分为多个不重叠的子树.

classNode{
intdata;
Nodeleft,right;

publicNode(intitem){
data=item;
left=right=null;
}
}

二、二叉树和二叉搜索树

1、二叉树是每个节点最多只能有两个子节点的树形结构结构,一般子节点称为“左子节点”和“右子节点”。

二叉树形结构的遍历有三种方式:前序遍历、中序遍历和后序遍历。

voidprintPreorder(Nodenode){
if(node==null)
return;

//先输出当前节点的数据
System.out.print(node.data+"");

//递归打印左子节点
printPreorder(node.left);

//现在递归打印右子节点
printPreorder(node.right);
}

二叉搜索树(BST)是一种特性的二叉树:每个节点的值,都大于其左子树的所有节点的值,并且小于右子树形结构的所有节点的值。

classNode{
intkey;
Nodeleft,right;

publicNode(intitem){
key=item;
left=right=null;
}
}

classBinaryTree{
Noderoot;
voidinsert(intkey){root=insertRec(root,key);}

NodeinsertRec(Noderoot,intkey){
if(root==null){
root=newNode(key);
returnroot;
}
if(key<root.key)
root.left=insertRec(root.left,key);
elseif(key>root.key)
root.right=insertRec(root.right,key);
returnroot;
}

voidinorder(){inorderRec(root);}
voidinorderRec(Noderoot){
if(root!=null){
inorderRec(root.left);
System.out.println(root.key);
inorderRec(root.right);
}
}
}

三、平衡二叉树形结构与红黑树形结构

1、平衡二叉搜索树是其每一个节点的两个子树的高度差最多为1的二叉搜索树,它通过旋转操作,保障树的平衡,从而优化了树的查询速度。

2、红黑树则是一种自平衡的二叉查找树,它在执行插入和删除操作的时候,通过特定的操作保持树的平衡。

以下是其特性:

(1)每个节点或是红色,或是黑色。

(2)根节点是黑色。

(3)每个叶节点(叶节点默认是空节点(NIL)或null)都是黑色的。

(4)如果一个节点是红的,则它的子节点都是黑的。

(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。

classNode{
intdata;
Nodeparent;
Nodeleft;
Noderight;
intcolor;
}
publicclassRedBlackTree{

privateNoderoot;
privateNodeTNULL;

//Preorder
privatevoidpreOrderHelper(Nodenode){
if(node!=TNULL){
preOrderHelper(node.left);
preOrderHelper(node.right);
}
}

//In-order
privatevoidinOrderHelper(Nodenode){
if(node!=TNULL){
inOrderHelper(node.left);
inOrderHelper(node.right);
}
}

//Postorder
privatevoidpostOrderHelper(Nodenode){
if(node!=TNULL){
postOrderHelper(node.left);
postOrderHelper(node.right);
}
}

//Balancethetreeafterdeletionofanode
privatevoidfixDelete(Nodex){
Nodes;
while(x!=root&&x.color==0){
if(x==x.parent.left){
s=x.parent.right;
if(s.color==1){
//case3.1
s.color=0;
x.parent.color=1;
leftRotate(x.parent);
s=x.parent.right;
}

if(s.left.color==0&&s.right.color==0){
//case3.2
s.color=1;
x=x.parent;
}else{
if(s.right.color==0){
//case3.3
s.left.color=0;
s.color=1;
rightRotate(s);
s=x.parent.right;
}

//case3.4
s.color=x.parent.color;
x.parent.color=0;
s.right.color=0;
leftRotate(x.parent);
x=root;
}
}else{
//sameas"if(x==x.parent.left)"theotherwayaround
}
}
x.color=0;
}

//Balancethetreeafterinsertionofanode
privatevoidfixInsert(Nodek){
Nodeu;
while(k.parent.color==1){
if(k.parent==k.parent.parent.right){
u=k.parent.parent.left;

//uncleisRED
if(u.color==1){
u.color=0;
k.parent.color=0;
k.parent.parent.color=1;
k=k.parent.parent;
}else{
if(k==k.parent.left){
k=k.parent;
rightRotate(k);
}
//uncleisBLACK
k.parent.color=0;
k.parent.parent.color=1;
leftRotate(k.parent.parent);
}
}else{
//mirrorimageofabovecode
//theotherwayaround
}
if(k==root){
break;
}
}
root.color=0;
}

//...
}

原创文章,作者:小蓝,如若转载,请注明出处:https://www.beidandianzhu.com/g/1047.html

(0)
小蓝的头像小蓝
上一篇 2024-12-17 14:06:46
下一篇 2024-12-17

相关推荐

  • Python删除数据库指定数据的方法

    在Python中,删除数据库中的指定数据是一项常见的操作。本文将从多个方面详细介绍Python中删除数据库指定数据的方法。 一、连接数据库 删除数据库中的数据之前,首先需要连接到数…

    程序猿 2024-12-29
  • Python按日期画图

    在Python中,我们可以使用各种库和工具来进行数据可视化和绘图。而按日期进行绘图是一种常见的需求,可以用于展示时间序列数据的趋势和变化。本文将从多个方面介绍如何使用Python按…

    程序猿 2024-12-20
  • Python中列表如何删除元素

    在Python编程中,列表(List)是一种常用的数据结构,可以存储多个元素。当我们需要删除列表中的某个元素时,有多种方法可以实现。本文将从多个方面详细介绍如何在Python中删除…

    程序猿 2024-12-23
  • 用Python分析房屋抵押贷款

    房屋抵押贷款是一种常见的金融服务,它可以让房屋所有者借款使用房屋作为抵押物。Python作为一种强大的编程语言,可以帮助我们对房屋抵押贷款进行全面的分析。 一、房屋抵押贷款数据收集…

    程序猿 2024-12-17
  • Python搭配什么语言最好

    Python作为一门功能强大且使用广泛的脚本语言,在与其他语言的搭配上有着很大的灵活性。下面将从几个方面详细阐述Python与哪些语言最为配合得好,并给出相应的代码示例。 一、Py…

    程序猿 2024-12-22
  • 用Python画中国象棋棋盘

    中国象棋是一种古老而充满策略性的棋类游戏,它包含了丰富多样的棋子和棋盘布局。在本文中,我们将使用Python编程语言来画出中国象棋的棋盘。 一、准备工作 在开始编写代码之前,我们需…

    程序猿 2024-12-17
  • 支持Python库的Lisp

    本文将介绍如何在Lisp中支持Python库的使用。 一、安装Python解释器 要在Lisp中使用Python库,首先需要安装Python解释器。 在Linux系统下,可以使用以…

    程序猿 2024-12-22
  • for循环内的赋值Python

    在本文中,我们将详细讨论Python中for循环内的赋值。首先让我们来解答标题。 在Python中,for循环内的赋值允许我们在每次迭代过程中将一个值赋给一个变量。这样我们就可以在…

    程序猿 2024-12-27
  • Python2中支持中文编码的方法

    Python2是一种强大的编程语言,但在默认情况下并不直接支持中文编码。然而,有几种方法可以在Python2中使用中文编码,以满足需要处理中文字符的需求。本文将从多个方面详细介绍P…

    程序猿 2024-12-22
  • Python第三方库

    Python作为一门功能强大且易于学习的编程语言,拥有大量的第三方库去扩展其功能。这些第三方库是由Python开发者社区提供的,因此被称为Python第三方库。本文将从多个方面详细…

    程序猿 2024-12-25

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

分享本页
返回顶部