RedBlackTree插入的java实现

RedBlackTree插入的java实现,java,algorithm,data-structures,tree,red-black-tree,Java,Algorithm,Data Structures,Tree,Red Black Tree,我正在尝试实现红黑树的CLRS伪代码。当我试图运行该程序时,会抛出NullPointerException。请检查代码并找出其中的错误。欢迎提出进一步建议 public class RedBlackTree { Node nil; Node root; String RED = "red"; String BLACK = "black"; public void left_rotate(RedBlackTree T, Node x) { Node y = x.right; x

我正在尝试实现红黑树的CLRS伪代码。当我试图运行该程序时,会抛出
NullPointerException
。请检查代码并找出其中的错误。欢迎提出进一步建议

public class RedBlackTree {

Node nil;
Node root;
String RED = "red";
String BLACK = "black";

public void left_rotate(RedBlackTree T, Node x) {
    Node y = x.right;
    x.right = y.left;
    if (y.left != T.nil)
        y.left.parent = x;
    y.parent = x.parent;
    if (x.parent == T.nil)
        T.root = y;
    else if (x == x.parent.left)
        x.parent.left = y;
    else
        x.parent.right = y;
    y.left = x;
    x.parent = y;
}

public void right_rotate(RedBlackTree T, Node x) {
    Node y = x.left;
    x.left = y.right;
    if (y.right != T.nil)
        y.right.parent = x;
    y.parent = x.parent;
    if (x.parent == T.nil)
        T.root = y;
    else if (x == x.parent.right)
        x.parent.right = y;
    else
        x.parent.left = y;
    y.right = x;
    x.parent = y;
}

public void rb_insert_fixup(RedBlackTree T, Node z) {

    while (z.parent.color == RED) {
        if (z.parent == z.parent.parent.left) {
            Node y = z.parent.parent.right;
            if (y.color == 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;
                    left_rotate(T, z);
                }
                z.parent.color = BLACK;
                z.parent.parent.color = RED;
                right_rotate(T, z.parent.parent);
            }
        } else {
            Node y = z.parent.parent.left;
            if (y.color == 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;
                    right_rotate(T, z);
                }
                z.parent.color = BLACK;
                z.parent.parent.color = RED;
                left_rotate(T, z.parent.parent);
            }
        }

    }
    T.root.color = BLACK;
}

public void insert(RedBlackTree T, Node z) {
    Node y = T.nil;
    Node x = T.root;
    while (x != T.nil) {
        y = x;
        if (z.key < x.key)
            x = x.left;
        else
            x = x.right;
    }
    z.parent = y;
    if (y == T.nil)
        T.root = z;
    else if (z.key < y.key)
        y.left = z;
    else
        y.right = z;
    z.left = T.nil;
    z.right = T.nil;
    z.color = RED;
    rb_insert_fixup(T, z);
}

public void inorder_tree_walk(Node x) {
    if (x != null) {
        inorder_tree_walk(x.left);
        System.out.println(x.key + ":" + x.color + " ");
        inorder_tree_walk(x.right);
    }
}

public static void main(String[] args) {
    RedBlackTree rbt = new RedBlackTree();

    Node a = new Node(12, "a");
    rbt.insert(rbt, a);
    Node b = new Node(5, "b");
    rbt.insert(rbt, b);
    Node c = new Node(18, "c");
    rbt.insert(rbt, c);
    Node d = new Node(2, "d");
    rbt.insert(rbt, d);
    Node e = new Node(9, "e");
    rbt.insert(rbt, e);

    rbt.inorder_tree_walk(rbt.root);
    }

}

class Node {
int key;
String data;
String color;
Node left, right, parent;

public Node(int key, String data) {
    this.key = key;
    this.data = data;
    }
}
公共类RedBlackTree{
节点零;
节根;
字符串RED=“RED”;
字符串BLACK=“BLACK”;
公共空心左旋转(红黑树T,节点x){
节点y=x,右;
x、 右=y.左;
如果(y.左!=T.零)
y、 left.parent=x;
y、 父=x.parent;
如果(x.parent==T.nil)
T.根=y;
else if(x==x.parent.left)
x、 parent.left=y;
其他的
x、 parent.right=y;
y、 左=x;
x、 父代=y;
}
公共空间右旋转(红黑树T,节点x){
节点y=x.左;
x、 左=y。右;
如果(y.right!=T.nil)
y、 right.parent=x;
y、 父=x.parent;
如果(x.parent==T.nil)
T.根=y;
else if(x==x.parent.right)
x、 parent.right=y;
其他的
x、 parent.left=y;
y、 右=x;
x、 父代=y;
}
公共无效rb_插入_修复(红黑树T,节点z){
而(z.parent.color==红色){
if(z.parent==z.parent.parent.left){
节点y=z.parent.parent.right;
如果(y.color==红色){
z、 parent.color=黑色;
y、 颜色=黑色;
z、 parent.parent.color=红色;
z=z.parent.parent;
}否则{
如果(z==z.parent.right){
z=z.parent;
左旋转(T,z);
}
z、 parent.color=黑色;
z、 parent.parent.color=红色;
右旋转(T,z.父对象.父对象);
}
}否则{
节点y=z.parent.parent.left;
如果(y.color==红色){
z、 parent.color=黑色;
y、 颜色=黑色;
z、 parent.parent.color=红色;
z=z.parent.parent;
}否则{
如果(z==z.parent.left){
z=z.parent;
右旋(T,z);
}
z、 parent.color=黑色;
z、 parent.parent.color=红色;
左旋转(T,z.父对象,父对象);
}
}
}
T.root.color=黑色;
}
公共空白插入(红黑树T,节点z){
节点y=T.nil;
节点x=T.root;
而(x!=T.nil){
y=x;
如果(z键
StackTrace是:

线程“main”java.lang.NullPointerException中出现异常 在RedBlackTree.rb\u插入\u修复(RedBlackTree.java:42) 在RedBlackTree.insert(RedBlackTree.java:102) 位于RedBlackTree.main(RedBlackTree.java:117)


必须初始化
nil
root

public class RedBlackTree {

Node nil;  <-- is null
Node root; <-- is null
公共类RedBlackTree{

Node nil;请仔细检查一下,看看是否可以修复,如果不能,请添加完整的stacktraceThank。但是我找不到错误。正如其中一个答案所建议的,Node nil和root需要初始化。但即使在那之后,它仍然抛出NullPointerException。你能帮忙吗?你能提供来自何处的链接吗你引用了红黑树的CLRS伪代码..bcoz我试着运行你的程序,发现了很多异常…即使我给你修复了上面的stackTrace异常,它也会给你另一个异常bcoz你没有正确实现插入代码。我试着自己实现伪代码。我在学习数据结构方面是相当新的,这就是可能会发生很多错误。如果你有CLR,那么你能检查一下我在实现中犯了什么错误吗。我将非常感谢你。我犯了这个错误。这是因为我没有初始化nil和根节点。代码中有一个小错误。在纠正这些错误后,程序正确运行。谢谢你的帮助。即使在r我将nil和root初始化为null,它仍在抛出NullPointerException。我犯了错误。这是因为我没有初始化nil和root节点。我把nil和null节点混淆了。现在我明白了。代码中有一个小错误。在更正了这些错误后,程序正确运行。谢谢您的帮助。@aditya很高兴帮助您!
while (z.parent.color == RED) { <-- z.parent is null