java红黑树实现代码怎么写

46次阅读
没有评论

共计 2166 个字符,预计需要花费 6 分钟才能阅读完成。

以下是一个简单的红黑树实现代码示例:

class Node {int data;
    Node left, right, parent;
    boolean color;  // true 表示红色,false 表示黑色 
    
    public Node(int data) {this.data = data;
        this.color = true;  // 新插入的节点默认为红色 
        this.left = this.right = this.parent = null;
    }
}

public class RedBlackTree {private Node root;
    
    // 红黑树左旋转 
    private void leftRotate(Node x) {Node y = x.right;
        x.right = y.left;
        if (y.left != null) {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;
    }
    
    // 红黑树右旋转 
    private void rightRotate(Node x) {Node y = x.left;
        x.left = y.right;
        if (y.right != null) {y.right.parent = x;}
        y.parent = x.parent;
        if (x.parent == null) {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 insert(int data) {Node newNode = new Node(data);
        Node parent = null;
        Node current = root;
        
        while (current != null) {
            parent = current;
            if (data < current.data) {current = current.left;} else {current = current.right;}
        }
        
        newNode.parent = parent;
        if (parent == null) {root = newNode;} else if (data < parent.data) {parent.left = newNode;} else {parent.right = newNode;}
        
        insertFixUp(newNode);
    }
    
    // 红黑树插入修正 
    private void insertFixUp(Node x) {while (x != root && x.parent.color == true) {if (x.parent == x.parent.parent.left) {Node y = x.parent.parent.right;
                if (y != null && y.color == true) {x.parent.color = false;
                    y.color = false;
                    x.parent.parent.color = true;
                    x = x.parent.parent;
                } else {if (x == x.parent.right) {
                        x = x.parent;
                        leftRotate(x);
                    }
                    x.parent.color = false;
                    x.parent.parent.color = true;
                    rightRotate(x.parent.parent);
                }
            } else {Node y = x.parent.parent.left;
                if (y != null && y.color == true) {x.parent.color = false;
                    y.color = false;
                    x.parent.parent.color = true;
                    x = x.parent.parent;
                } else {if (x == x.parent.left) {
                        x = x.parent;
                        rightRotate(x);
                    }
                    x.parent.color = false;
                    x.parent.parent.color = true;
                    leftRotate(x.parent.parent);
                }
            }
        }
        root.color = false;
    }
    
    // 中序遍历打印红黑树 
    public void inorderTraversal(Node node) {if (node != null) {inorderTraversal(node.left);
            System.out.print(node.data + " ");
            inorderTraversal(node.right);
        }
    }
    
    public static void main(String[] args) {RedBlackTree rbTree = new RedBlackTree();
        
        rbTree.insert(7);
        rbTree.insert(3);
        rbTree.insert(18);
        rbTree.insert(10);
        rbTree.insert(22);
        rbTree.insert(8);
        rbTree.insert(11);
        
        rbTree.inorderTraversal(rbTree.root);
    }
}

以上是一个简单的红黑树实现,包含了插入和修正操作。您可以根据需要进行进一步扩展和优化。

丸趣 TV 网 – 提供最优质的资源集合!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2024-03-19发表,共计2166字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)