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实现相关推荐

  1. 红黑树详解,对插入旋转独到理解

    一.红黑树的简介 R-B Tree,全称是Red-Black Tree,又称为"红黑树",它一种特殊的二叉查找树.红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑 ...

  2. 红黑树的红黑标志有什么用

    红黑树使用红黑二色进行"着色",目的是利用颜色值作为二叉树的平衡对称性的检查,只要插入的节点"着色"满足红黑二色的规定,最短路径与最长路径不会相差的太远,红黑树 ...

  3. 红黑树和红黑树的原理详解

    红黑树是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组.它是在1972年由鲁道夫·贝尔发明的,他称之为"对称二叉B树",它现代的名字是在 Leo ...

  4. 二叉树、二叉搜索树,平衡二叉树(旋转)红黑树(红黑规则)

    文章目录 3.数据结构 3.1二叉树[理解] 3.2 二叉查找树[理解] 3.3平衡二叉树[理解] 3.4 红黑树[理解] 3.数据结构 3.1二叉树[理解] 二叉树的特点 二叉树中,任意一个节点的度 ...

  5. 一看就懂的红黑树之红黑树的实现

    实现红黑树的基本思想 大家静下心好好读读,确实很难很难,静下心. 不知道你有没有玩过魔方?其实魔方的复原解法是有固定算法的:遇到哪几面是什么样子,对应就怎么转几下.你只要跟着这个复原步骤,就肯定能将魔 ...

  6. 红黑树动画+红黑树算法详细介绍

    说起红黑树,先给一个js的实现.可以动画看效果 https://www.cs.usfca.edu/~galles/visualization/RedBlack.html 然后算法问题,我再描述一遍也没 ...

  7. day063:红黑树、红黑规则

    目录 一.红黑树 1.什么是红黑树? 2.红黑树与平衡二叉树的区别 二.红黑规则 1.红黑规则有五点 2.红黑树添加节点 3. 添加节点的总结 一.红黑树 1.什么是红黑树? 红黑树(又称平衡二叉B树 ...

  8. 跨月作废发票,红字冲红注意事项 如何整理上交发票

    当月发票可作废,跨月无法作废,只能开红字发票作废,准确的说是开红字负数发票冲红,开红字发票方法: 山东金税盘如何跨月作废增值税普通发票 最近跨年作废了两张发票,准确的是开红字. 一张是给客户开了,也扫 ...

  9. 红蓝对抗-红队打点的那些事

    红蓝对抗-红队打点的那些事 攻防演练中作为攻击方,效率很重要,例如2019 BCS红队行动议题: RedTeam-BCS 半自动化的资产收集 域名/IP/需要交互的系统 当拿到目标的时候,首先需要利用 ...

最新文章

  1. pandas DataFrame(2)-行列索引及值的获取
  2. 数据库软件安装和数据库创建的几种方法
  3. 【Android 应用开发】Activity 返回堆栈管理 ( 栈内复用模式 singleTask | 单实例模式 singleInstance )
  4. 编码调试:UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xaf in position 12: illegal multibyte sequen
  5. jQuery.extend与jQuery.fn.extend的区别分析与实例
  6. leetcode71. 简化路径 Unix 风格
  7. python 类装饰器
  8. nodejs个人学习笔记
  9. Excel 去除重复行
  10. Android BKS 格式证书制作,JKS 制作 BKS,解决 java.security.KeyStoreException: JKS not found 问题
  11. MySQL第六讲 MySQL分库分表方案
  12. 能拿驾照就能通过 Elastic 认证考试!
  13. 猿辅导python助教面试两次都有什么内容_猿辅导面试信息第一手揭秘,小伙伴们看过来!...
  14. 什么是UI Path?
  15. 【BYM】Android 实现相机快门动画
  16. OATS-正交表测试策略
  17. 随机激活码生成器--制作随机字符串
  18. Unigui is compiled with:CodeGear™ Delphi® 2007 for Win32® R2 Version 11.0.2902.10471
  19. c语言性格测试小游戏,性格测试小游戏
  20. 使用ffmpeg拼接两张图片

热门文章

  1. 20190308 搜索基础测试题
  2. STM32的GPIO口能够承受多大电压? 哪些IO口能容忍5V?
  3. 为什么叫依赖倒转,怎么个倒转法?
  4. SQL卷土重来 成就炙手可热的大数据
  5. 线代第五章 特征值和特征向量 复习笔记
  6. Python爬虫,京东自动登录,在线抢购商品
  7. Jetbrains系列产品重置试用方法
  8. 华为mate40e字体大小调整实用方法
  9. DSP处理FFT和DFT时需要运算的次数及计算公式
  10. C语言之字符串强化练习题