package com.lsl;
public class redblacktree
}//節點左旋方法,將當前節點變為其右子樹的左子樹
private void leftrotate(redblacknode x)
y.parent = x.parent; //將x的父親變為y的父親
if (x.parent == null) else else
}y.left = x;//將變成y的左孩子
x.parent = y;//將y變成x的父節點
}//節點右旋方法,將當前節點變為其左孩子的右孩子
private void rightrotate(redblacknode y)
x.parent = y.parent; //將y的父親變為x的父親
if (y.parent == null) else else
}x.right = y;//將y變為x的右孩子
y.parent = x;//將x變為y的父親
}//重新調整紅黑樹的平衡方法
private void insertfixup(redblacknode node)
//情況二:叔叔是黑色,當前節點是右孩子
if (node == parent.right)
//情況三:叔叔是黑色,當前節點是左孩子
setblack(parent);
setred(gparent);
rightrotate(gparent);//祖父節點右旋
} else
//情況二:叔叔是黑色,當前節點是左孩子
if (node == parent.left)
//情況三:叔叔是黑色,當前節點是右孩子
setblack(parent);
setred(gparent);
leftrotate(gparent);}}
setblack(root);//將根設定為黑色
}/**
* 將節點先按照二叉查詢樹方法插入,設定為紅色,調整紅黑樹的平衡
* * @param node
*/private void inser***oe(redblacknode node) else
}node.parent = y;//將y設定成為當前節點的父親
if (y == null) else else
}setred(node);//將當前要插入的節點設定成為紅色
insertfixup(node);//重新調整紅黑樹的平衡
}/**
* 刪除節點方法
* 分為三種情況
* 1,左右子樹都不為空
* 2,左右子樹都為空
* 3,左右子樹有乙個為空
*/private void deletenode(redblacknode node) else if (node.parent.left == node) else
parent = replace.parent;
child = replace.right;
color = replace.color;
if (parent == node) else
parent.left = child;
replace.right = node.right;
node.right.parent = replace;
}replace.parent = node.parent;
replace.color = node.color;
replace.left = node.left;
node.left.parent = replace;
node = null;
if (color == true)
return;
}if (node.left != null) else
parent = node.parent;
color = node.color;
if (parent == null) else if (node == parent.left)
} else
}if (color == true)
node = null;
}/**
* 刪除節點後重新調整平衡
* 分為兩大類
* 一:other為紅色二①,父由黑變紅,other由紅變黑,父左旋,變成二①
* ①調整為
* 二:other為黑色
* ①:左右孩子都為黑色,父變紅,向上遞迴
* ②:如果other為parent的右子樹,other的右孩子是黑色(nil),左孩子是紅色,other和左孩子變換顏色,other右旋,other為左子樹
* 時相反
* ③:如果other為parent的右子樹,other的右孩子是紅色,左孩子任意顏色,父親顏色給other,父變黑,other的右孩子變黑,other右旋
* other為左子樹時相反
* @param node
* @param parent
*/private void deletefixup(redblacknode node, redblacknode parent)
if ((other.left == null || isblack(other.left)) && (other.right == null || isblack(other.right)))
if ((other.right == null || isblack(other.right)) && isred(other.left))
if (isred(other.right))
} else
if ((other.left == null || isblack(other.left)) && (other.right == null || isblack(other.right)))
if ((other.left == null || isblack(other.left)) && isred(other.right))
if (isred(other.left)) }}
if (node != null)
}/**
* 刪除節點外部介面
* * @param key
*/public void delete(int key) else
}/**
* 查詢給定key值的節點
* * @param key 給定的key值
* @return 返回null說明沒有找到
*/private redblacknode search(redblacknode node,int key) else
}} else if (tmp < 0) else
}} else
}return null;
}/**
* 外部介面,插入實際的資料
* * @param key
*/public void insert(int key)
/** * 返回節點的父親節點
* * @param node
* @return
*/private redblacknode parentof(redblacknode node)
/** * 判斷節點的顏色
* * @param node
* @return
*/private boolean isred(redblacknode node)
/** * 判斷節點的顏色
* * @param node
* @return
*/private boolean isblack(redblacknode node)
/** * 設定當前節點為紅色
* * @param node
*/private void setred(redblacknode node)
/** * 設定當前節點為黑色
* * @param node
*/private void setblack(redblacknode node)
/** * 比較兩個節點的關鍵
* * @param node
* @param x
* @return 返回1,node>x 返回-1,nodex.key) else if (node.key < x.key) else
}/**
* 尋找當前節點的後繼結點方法
* @param node 當前節點
* @return 返回後繼結點
*/private redblacknode successornode(redblacknode node)
return node;
}/**
* 先序遍歷樹
* * @param root
*/public void preorder(redblacknode root)
}/**
* 中序遍歷樹
* * @param root
*/public void inorder(redblacknode root)
}/**
* 後序遍歷樹
* * @param root
*/public void postorder(redblacknode root)
}public static void main(string args)
紅黑樹的java實現
紅黑樹的原理以及演算法見文章 紅黑樹的節點定義 package org.algorithm.redblacktree created with intellij idea.user qarkly date 14 6 8 time 下午11 16 to change this template use...
紅黑樹的Java實現
紅黑樹 red black tree,簡稱rb樹 是一種特殊的二叉查詢樹,所以他也滿足二叉查詢樹的特徵 任意乙個節點的值大於右子節點的鍵值,小於左子節點的鍵值。除此之外,紅黑樹還具備很多其他特徵 1 每個節點都是紅色或者黑色 2 根節點必定為黑色 3 每個葉節點 左右子節點都為null的節點 必定是...
紅黑樹實現
紅黑樹 是一棵二叉搜尋樹,它在每個節點上增加了乙個儲存位來表示節點的顏色,可以是red或black。通過對任何一條從根到葉子簡單路徑上的 顏色來約束,紅黑樹保證最長路徑不超過最短路徑的兩倍,因而近似於平衡 由於性質中紅色節點不連續,最短路徑可為全是連續黑結點,最長路徑則由於紅節點不連續,則每間隔乙個...