java實現紅黑樹

2021-09-24 12:20:26 字數 4695 閱讀 3510

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。通過對任何一條從根到葉子簡單路徑上的 顏色來約束,紅黑樹保證最長路徑不超過最短路徑的兩倍,因而近似於平衡 由於性質中紅色節點不連續,最短路徑可為全是連續黑結點,最長路徑則由於紅節點不連續,則每間隔乙個...