自顶向下红黑树java_红黑树之插入java实现
package第一章数据结构实现;public classRBTree {
TreeNode head;//树的头节点//创建红色的默认节点,但是未设置父节点
public TreeNode getNode(intval) {
TreeNode defaultNode= newTreeNode(val);
defaultNode.color= Color.RED; //默认为红色
returndefaultNode;
}//打印树
public voidprintTree(TreeNode node) {if(head==null) {
System.out.println("树是空的,请确认init()方法已经执行!");return;
}if(node==null) return;else{//前序遍历
System.out.print("节点的值:"+node.val+" 节点的颜色:"+node.color);if(node.parent!=null) System.out.println(" 节点的父节点:"+node.parent.val);else System.out.println(" 这是根节点");
printTree(node.left);
printTree(node.right);
}
}//===================================================================================================//树的初始化
public void init(int[] arr) {for(int i=0;i
insert(head,null,arr[i],-1);
}
}//inset 开始插入 ,lr为0代表left lr为1代表right lr为-1表示是根节点
public void insert(TreeNode head,TreeNode parent,int i,intlr) {
if(head==null) {
TreeNode x=getNode(i);
x.parent=parent;
head= x;
if(lr==1) parent.right =head;else if(lr==0) parent.left =head;
insert1(head);
}else { //递归插入
if(i>head.val) insert(head.right,head,i,1);if(i
}
}//case1:插入的节点为根节点,将插入节点置为红色,前期x的父节点x.parent必须确定下来
public voidinsert1(TreeNode x) {if(x.parent==null) {
x.color=Color.BLACK;
head= x; //将首节点指向x
return;
}elseinsert2(x);
}//case2:插入的节点不为根节点//且插入的节点的父节点为黑色的,那么红黑树是不用调节的
public voidinsert2(TreeNode x) {if(x.parent.color==Color.BLACK) return;elseinsert3(x);
}//case3如果插入节点的父节点为红色 ,违反父子节点都为红色的//如果叔叔节点为红色,只需将叔叔节点和父节点同时设为黑色,同时祖父节点设为红色//但这会引入新问题,祖父节点和其自身父节点有可能都为红色,使用尾递归向上上滤
public voidinsert3(TreeNode x) {
TreeNode par= x.parent; //父节点
TreeNode gra = par.parent; //祖父节点
TreeNode unc = (par==gra.left)? gra.right : gra.left; //叔叔节点
if(unc!=null && unc.color==Color.RED) {
unc.color=Color.BLACK;
par.color=Color.BLACK;
gra.color=Color.RED;
insert1(gra);//尾递归上滤
} elseinsert4(x);
}//case4: 如果叔叔节点为黑色或者null
public voidinsert4(TreeNode x) {
TreeNode par= x.parent; //父节点
TreeNode gra = par.parent; //祖父节点//如果父节点是祖父节点的左节点,但x是父节点的右节点,交换x和其父节点,且x变为其原父节点的父节点
if(par==gra.left && x==par.right) {
gra.left=x;
x.left=par;
x.parent=gra;
par.right= null;
par.parent=x;
insert5(par);
}//如果父节点是祖父节点的右节点,但是x是父节点的左节点,交换x和其父节点,且x变为祖父节点的右节点
else if(par==gra.right && x==par.left) {
gra.right=x;
x.right=par;
x.parent=gra;
par.left= null;
par.parent=x;
insert5(par);
}else{
insert5(x);//因为这个x节点有可能变为父节点了,所以要在insert5进行判断是否为变换后的父节点
}
}public voidinsert5(TreeNode x) {
TreeNode par= x.parent; //父节点
TreeNode gra = par.parent; //祖父节点
TreeNode ggra = gra.parent; //祖父节点的父节点
if(x==par.left) {
gra.left=par.right;
par.right=gra;
par.parent=ggra;
gra.parent=par;if(gra.left!=null) gra.left.parent = gra; //如果节点不为空更新父节点信息//ggra.left = par;
if(ggra==null) head =par;else{if(par.val>ggra.val) ggra.right =par;else ggra.left =par;
}
}else if(x==par.right) {//if(x.val==12) System.out.println("12的父节点的左节点:"+par.left.val);
gra.right =par.left;
par.left=gra;
par.parent=ggra;
gra.parent=par;if(gra.right!=null) gra.right.parent = gra; //要更新父节点信息
if(ggra==null) head = par; //根节点要重新指向
else{if(par.val>ggra.val) ggra.right =par;else ggra.left =par;
}
}//颜色变化
gra.color =Color.RED;
par.color=Color.BLACK;
}//=======================================================================================================
public static voidmain(String[] args) {int[] arr = {5,3,1,7,9,6,15,12,14,13};
RBTree rbt= newRBTree();
rbt.init(arr);
rbt.printTree(rbt.head);
}//红黑树节点
private classTreeNode{
Color color=Color.RED;intval;
TreeNode left;
TreeNode right;
TreeNode parent;TreeNode(intvalue) {
val=value;
}
}//树节点枚举类
private enumColor{
RED,BLACK;
}
}
自顶向下红黑树java_红黑树之插入java实现相关推荐
- 红黑树详解,对插入旋转独到理解
一.红黑树的简介 R-B Tree,全称是Red-Black Tree,又称为"红黑树",它一种特殊的二叉查找树.红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑 ...
- 红黑树的红黑标志有什么用
红黑树使用红黑二色进行"着色",目的是利用颜色值作为二叉树的平衡对称性的检查,只要插入的节点"着色"满足红黑二色的规定,最短路径与最长路径不会相差的太远,红黑树 ...
- 红黑树和红黑树的原理详解
红黑树是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组.它是在1972年由鲁道夫·贝尔发明的,他称之为"对称二叉B树",它现代的名字是在 Leo ...
- 二叉树、二叉搜索树,平衡二叉树(旋转)红黑树(红黑规则)
文章目录 3.数据结构 3.1二叉树[理解] 3.2 二叉查找树[理解] 3.3平衡二叉树[理解] 3.4 红黑树[理解] 3.数据结构 3.1二叉树[理解] 二叉树的特点 二叉树中,任意一个节点的度 ...
- 一看就懂的红黑树之红黑树的实现
实现红黑树的基本思想 大家静下心好好读读,确实很难很难,静下心. 不知道你有没有玩过魔方?其实魔方的复原解法是有固定算法的:遇到哪几面是什么样子,对应就怎么转几下.你只要跟着这个复原步骤,就肯定能将魔 ...
- 红黑树动画+红黑树算法详细介绍
说起红黑树,先给一个js的实现.可以动画看效果 https://www.cs.usfca.edu/~galles/visualization/RedBlack.html 然后算法问题,我再描述一遍也没 ...
- day063:红黑树、红黑规则
目录 一.红黑树 1.什么是红黑树? 2.红黑树与平衡二叉树的区别 二.红黑规则 1.红黑规则有五点 2.红黑树添加节点 3. 添加节点的总结 一.红黑树 1.什么是红黑树? 红黑树(又称平衡二叉B树 ...
- 跨月作废发票,红字冲红注意事项 如何整理上交发票
当月发票可作废,跨月无法作废,只能开红字发票作废,准确的说是开红字负数发票冲红,开红字发票方法: 山东金税盘如何跨月作废增值税普通发票 最近跨年作废了两张发票,准确的是开红字. 一张是给客户开了,也扫 ...
- 红蓝对抗-红队打点的那些事
红蓝对抗-红队打点的那些事 攻防演练中作为攻击方,效率很重要,例如2019 BCS红队行动议题: RedTeam-BCS 半自动化的资产收集 域名/IP/需要交互的系统 当拿到目标的时候,首先需要利用 ...
最新文章
- pandas DataFrame(2)-行列索引及值的获取
- 数据库软件安装和数据库创建的几种方法
- 【Android 应用开发】Activity 返回堆栈管理 ( 栈内复用模式 singleTask | 单实例模式 singleInstance )
- 编码调试:UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xaf in position 12: illegal multibyte sequen
- jQuery.extend与jQuery.fn.extend的区别分析与实例
- leetcode71. 简化路径 Unix 风格
- python 类装饰器
- nodejs个人学习笔记
- Excel 去除重复行
- Android BKS 格式证书制作,JKS 制作 BKS,解决 java.security.KeyStoreException: JKS not found 问题
- MySQL第六讲 MySQL分库分表方案
- 能拿驾照就能通过 Elastic 认证考试!
- 猿辅导python助教面试两次都有什么内容_猿辅导面试信息第一手揭秘,小伙伴们看过来!...
- 什么是UI Path?
- 【BYM】Android 实现相机快门动画
- OATS-正交表测试策略
- 随机激活码生成器--制作随机字符串
- Unigui is compiled with:CodeGear™ Delphi® 2007 for Win32® R2 Version 11.0.2902.10471
- c语言性格测试小游戏,性格测试小游戏
- 使用ffmpeg拼接两张图片