- 浏览: 77792 次
- 性别:
- 来自: 拜月神教
最新评论
-
huangfenghit:
你绝对的大牛~
答复: 阿里巴巴面试感言 -
liuxuejin:
好!慢慢下载来看看
区间树 -
xiaobian:
看不懂,怎么知道是讲的好呢 ?
数据挖掘 决策树ID3算法原理 -
longay00:
不错,很牛,不过没有原理与实验很难相信它的正确性。从代码上看, ...
决策树C4.5算法 -
yangguo:
用我的study方法就可以了。
答复: java最优算法讨论
package acmcode; /** * Red-Black Tree * * @author Leon.Chen */ public class RBTree { /** * 红 */ private static final String RED = "red"; /** * 黑 */ private static final String BLACK = "black"; /** * 根节点 */ private RBNode root; /** * 左旋转 * * @param x */ private void leftRotate(RBNode x) { RBNode y = x.right; x.right = y.left; y.left.parent = x; y.parent = x.parent; if (x.parent == null) { root = y; } else { if (x == x.parent.left) { x.parent.left = y; } else { x.parent.right = y; } } y.left = x; x.parent = y; } /** * 右旋转 * * @param y */ private void rightRotate(RBNode y) { RBNode x = y.left; y.left = x.right; x.right.parent = y; x.parent = y.parent; if (y.parent == null) { root = x; } else { if (y == y.parent.left) { y.parent.left = x; } else { y.parent.right = x; } } x.right = y; y.parent = x; } /** * 红黑树插入方法 * * @param z */ public void RBInsert(RBNode z) { if (root == null) { root = z; root.color = BLACK; } else { RBNode x = root; RBNode y = null; while (isNotNilNode(x)) { y = x; if (z.value.compareTo(x.value) < 0) { x = x.left; } else { x = x.right; } } if (z.value.compareTo(y.value) < 0) { y.left = z; } else { y.right = z; } z.color = RED; z.parent = y; } z.left = new RBNode(BLACK); z.right = new RBNode(BLACK); RBInsertFixUp(z); } /** * 解决插入冲突 * * @param z */ private void RBInsertFixUp(RBNode z) { while (z.parent != null && z.parent.color.equals(RED)) { if (z.parent == z.parent.parent.left) { RBNode y = z.parent.parent.right; if (y.color.equals(RED)) { z.parent.color = BLACK; y.color = BLACK; z.parent.parent.color = RED; z = z.parent.parent; } else if (z == z.parent.right) { z = z.parent; leftRotate(z); } else if (z == z.parent.left) { z.parent.color = BLACK; z.parent.parent.color = RED; rightRotate(z.parent.parent); } } else { RBNode y = z.parent.parent.left; if (y.color.equals(RED)) { z.parent.color = BLACK; y.color = BLACK; z.parent.parent.color = RED; z = z.parent.parent; } else if (z == z.parent.left) { z = z.parent; rightRotate(z); } else if (z == z.parent.right) { z.parent.color = BLACK; z.parent.parent.color = RED; leftRotate(z.parent.parent); } } } root.color = BLACK; } /** * @param deleteNode */ public void RBDelete(RBNode deleteNode) { RBNode y = null; RBNode z = serach(deleteNode.value); if (isNilNode(z.left) || isNilNode(z.right)) { y = z; } else { y = treeSuccessor(z); } RBNode x = null; if (isNotNilNode(y.left)) { x = y.left; } else { x = y.right; } x.parent = y.parent; if (isNilNode(y.parent)) { root = x; } else { if (y == y.parent.left) { y.parent.left = x; } else { y.parent.right = x; } } if (y != z) { z.value = y.value; } if (y.color.equals(BLACK)) { RBDeleteFixUp(x); } } /** * @param x */ private void RBDeleteFixUp(RBNode x) { System.out.println("===="+x.value); // 解决黑黑冲突,完善中 while (x != root && x.color.equals(BLACK)) { if (x == x.parent.left) { RBNode w = x.parent.right; if (w.color.equals(RED)) { w.color = BLACK; x.parent.color = RED; leftRotate(x.parent); w = x.parent.right; } else if (w.left.color.equals(BLACK) && w.right.color.equals(BLACK)) { w.color = RED; x = x.parent; } else if (w.right.color.equals(BLACK)) { w.left.color = BLACK; w.color = RED; rightRotate(w); w = x.parent.right; } else if (w.left.color.equals(BLACK)) { w.color = x.parent.color; x.parent.color = BLACK; w.right.color = BLACK; leftRotate(x.parent); x = root; } } else { RBNode w = x.parent.left; if (w.color.equals(RED)) { w.color = BLACK; x.parent.color = RED; rightRotate(x.parent); w = x.parent.left; } else if (w.left.color.equals(BLACK) && w.right.color.equals(BLACK)) { w.color = RED; x = x.parent; } else if (w.left.color.equals(BLACK)) { w.right.color = BLACK; w.color = RED; leftRotate(w); w = x.parent.left; } else if (w.right.color.equals(BLACK)) { w.color = x.parent.color; x.parent.color = BLACK; w.left.color = BLACK; rightRotate(x.parent); x = root; } } } x.color = BLACK; } /** * 找后继 * * @param node * @return RBNode */ public RBNode treeSuccessor(RBNode node) { if (node.right != null) { return treeMiniMum(node.right); } RBNode currentNode = getParentNode(node); while (currentNode != null && node == currentNode.right) { node = currentNode; currentNode = getParentNode(node); } return currentNode; } /** * 找前驱 * * @param node * @return RBNode */ public RBNode treePrecursor(RBNode node) { if (node.left != null) { return treeMaxiMum(node.left); } RBNode currentNode = getParentNode(node); while (currentNode != null && node == currentNode.left) { node = currentNode; currentNode = getParentNode(node); } return currentNode; } /** * 最大节点 * * @param node * @return RBNode */ public RBNode treeMaxiMum(RBNode node) { while (isNotNilNode(node.right)) { node = node.right; } return node; } /** * 最小节点 * * @param node * @return RBNode */ public RBNode treeMiniMum(RBNode node) { while (isNotNilNode(node.left)) { node = node.left; } return node; } /** * 找节点的父节点 * * @param node * @return TreeNode */ public RBNode getParentNode(RBNode node) { RBNode current = root; RBNode trailCurrent = null; while (isNotNilNode(current)) { if (current.value.compareTo(node.value) == 0) { break; } trailCurrent = current; if (node.value.compareTo(current.value) < 0) { current = current.left; } else { current = current.right; } } return trailCurrent; } /** * 搜索 * * @param value * @return TreeNode */ public RBNode serach(RBValue value) { return treeSerach(root, value); } /** * 搜索 * * @param node * @param value * @return TreeNode */ public RBNode treeSerach(RBNode node, RBValue value) { if (isNotNilNode(node) && node.value.compareTo(value) == 0) { return node; } if (value.compareTo(node.value) < 0) { return treeSerach(node.left, value); } else { return treeSerach(node.right, value); } } /** * 中序遍历 * * @param node */ public void inOrder(RBNode node) { if (isNotNilNode(node)) { inOrder(node.left); System.out.println(node.value+","+node.color); inOrder(node.right); } } /** * 先序遍历 * * @param node */ public void perOrder(RBNode node) { if (isNotNilNode(node)) { System.out.println(node.value+","+node.color); perOrder(node.left); perOrder(node.right); } } /** * @param node * @return 是否为NIL[T]节点 */ private boolean isNotNilNode(RBNode node) { return node != null && node.value != null; } /** * @param node * @return 是否为NIL[T]节点 */ private boolean isNilNode(RBNode node) { return !isNotNilNode(node); } /** * @param args */ public static void main(String[] args) { RBTree tree = new RBTree(); tree.RBInsert(new RBNode(new RBValue(3))); tree.RBInsert(new RBNode(new RBValue(4))); tree.RBInsert(new RBNode(new RBValue(12))); tree.RBInsert(new RBNode(new RBValue(13))); tree.RBInsert(new RBNode(new RBValue(11))); tree.RBInsert(new RBNode(new RBValue(15))); tree.RBDelete(new RBNode(new RBValue(12))); System.out.println("================="); System.out.println("root = "+tree.root.value); System.out.println("================="); tree.inOrder(tree.root); System.out.println("================="); tree.perOrder(tree.root); } }
package acmcode; /** * @author Leon.Chen * */ public class RBNode { public RBNode parent; public RBNode left; public RBNode right; public RBValue value; public String color; public RBNode(String color) { this.color = color; } public RBNode() { } public RBNode(RBValue value) { this.value = value; } }
package acmcode; public class RBValue { public int value; public RBValue(int value) { this.value = value; } public int compareTo(RBValue otherValue) { int thisVal = this.value; int anotherVal = otherValue.value; return (thisVal < anotherVal ? -1 : (thisVal == anotherVal ? 0 : 1)); } public String toString() { return new Integer(value).toString(); } }
忘了附图
评论
4 楼
OnJavaRoad
2008-11-07
先收藏了,找时间研究研究
3 楼
pf_miles
2008-07-17
引用
原来是树???。
小看了一下。。懂了。
小看了一下。。懂了。
是啊,是树~
我家门前有好几棵大的!
2 楼
Wallian_hua
2008-07-17
原来是树???。
小看了一下。。懂了。
小看了一下。。懂了。
1 楼
Wallian_hua
2008-07-17
没懂。。 这是什么
发表评论
-
庞果英雄会 覆盖数字
2013-11-14 15:13 821庞果覆盖数字原题如下 给定整数区间[a,b]和整数区间[x, ... -
2-3 tree
2013-10-09 17:10 715package com.leon.cc; imp ... -
编译原理生成LL1预测分析表
2013-08-11 20:47 5800package com.leon; impo ... -
应用倍增法后缀数组以及RMQ求解N个字符串最长公共子串问题
2011-11-30 16:35 1464/** * @see IOI2009国家集训队论文《后 ... -
谷哥的KOF连招问题
2010-10-09 14:38 1476传说问题是这样的 玩过KOF(拳皇)的人都知道,玩的时候会连招 ... -
KOF
2010-10-09 00:13 0package org.struct.trietree; ... -
ACM/ICPC HDU 1195
2010-09-06 10:37 1860本年度还有8篇博客需要完成 开篇前附加一个看完《盗梦空间》的我 ... -
答复: 阿里巴巴面试感言
2009-10-09 22:27 2147好吧,我承认我闲的蛋疼 问题:3000万条的记录取最大的前50 ... -
正向最大匹配改进算法
2009-05-26 22:11 5816AD.: 2年J2EE经验,熟悉常用数据结构算法,熟悉常 ... -
决策树C4.5算法
2009-05-19 02:05 5214数据挖掘中决策树C4.5预测算法实现(半成品,还要写规则后 ... -
区间树
2008-07-18 15:47 2145package acmcode; /** * ... -
四则运算的中缀转后缀,逆波兰表达式求值
2008-04-23 23:10 9008首先描述问题 给定一 ... -
最大0,1子矩阵
2008-04-20 21:16 5992首先描述一下问题 /** * * 时间限制(普 ... -
数据挖掘 决策树ID3算法原理
2008-04-11 22:24 11349上一篇博客写了ID3算法的简单实现 这一篇讲讲ID3的原理 写 ... -
决策树ID3算法
2008-04-01 22:18 7549算了,还是自己修正一个BUG.... package gr ... -
ext2.0 的XMLWriter
2008-02-20 21:04 1247做ext相关的一个example项目,把我们的客户端移植成ex ... -
树与哈夫曼树
2008-02-20 20:50 1546package tree; public ... -
LCS与图算法
2008-02-20 20:46 1196求两个字符串最长公共子串的问题。大体解法是用一个矩阵来记录两个 ... -
《程序员》算法擂台:骑士聚会
2008-02-20 20:40 1172在8×8的棋盘上分布着n个骑士,他们想约在某一个格中聚会。骑士 ...
相关推荐
红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树...
红黑树算法,随机产生数字,动态生成红黑树,可用于演示。
红黑树原理详解 红黑树原理详解 红黑树原理详解 红黑树原理详解
红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。 红黑树是在1972年由Rudolf Bayer发明的,当时被称为平衡二叉B树(symmetric binary B-trees)...
通用红黑树 说明: 用Linux内核红黑树封装的一个通用型的红黑树 如何使用该红黑树: 见rbtest1.c和rbtest2.c 直接make生成rbtest1和rbtest2 作者:rcyh 日期:2011年7月21日 ---------------------------------...
红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树
描述: 实现红黑树、二叉搜索树相关算法:插入(红黑树涉及树的调整:左旋右旋等),删除,搜索(指定Key值节点)。 另外,红黑树实现计算树黑高的算法。 1).插入测试,输入 8,11,17,15,6,1,22,25,27,...
红黑树的插入与删除_详细整理资料
红黑树和AVL树的代码实现,并显示树的形状,同时红黑树还可以输出个路径以及黑高度
描述: 实现红黑树、二叉搜索树相关算法:插入(红黑树涉及树的调整:左旋、右旋等),删除,搜索(指定Key值节点)。 另外,红黑树实现计算树黑高的算法。 1).插入测试,输入 8,11,17,15,6,1,22,25,27...
问题描述: 实现红黑树、二叉搜索树相关算法:插入(红黑树涉及树的调整:左旋、右旋等),删除,搜索(指定Key值节点)。 另外,红黑树实现计算树黑高的算法。 实验要求: 1).插入测试,输入 8,11,17,15,6,...
用c实现的红黑树,经典的红黑树, 速度与思维的立体化结构
在学习c++的过程中实现的红黑树,功能比较完善,无优化..
红黑树的c实现源码与剖析 原作者:那谁 源码剖析作者:July ===================== July说明: 由于原来的程序没有任何一行注释,我把它深入剖析,并一行一行的添加了注释, 详情请参见此文: 教你彻底实现红黑树:...
红黑树的C语言实现 算法导论的红黑树C实现
实验1:实现红黑树的基本算法, 对n的取值分别为 12、24、36、48、60,随机生成n 个互异的正整数(K1, K2, K3, ……, Kn)作为节点的关键字,向一棵初始空的红黑树中依次插入这n 个节点,统计算法运行所需时间 ,画...
该资源是一个红黑树的demo程序,包含了红黑树的插入和红黑树的删除过程,实现方式相对比较简单明了,适合于刚刚接触红黑树的入门者阅读。
红黑树继承二叉查找树,区间树继承红黑树,main函数中写的是区间树的测试程序
26红黑树 27红黑树_0 28红黑树_1 29红黑树_2 30红黑树_3 31红黑树_4 32红黑树_5 33红黑树_6 34堆 35堆排序 36哈希与映射的概述 37B树有什么用 38B树的概念 39图_邻接矩阵 40图_邻接表 41图_DFS 42图_BFS
研究数据结构的红黑树的时候想验证自己写的红黑树算法总是很麻烦,自己用h5写了个图形化的工具,只需要把红黑树转换成json然后复制粘贴到代码的tree变量即可