zoukankan      html  css  js  c++  java
  • 红黑树(C#)

    参考:http://blog.csdn.net/v_JULY_v/article/details/6105630

    参考:http://www.cnblogs.com/skywang12345/p/3624343.html

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Diagnostics;
    using System.Threading;
    using System.IO;
    using System.Collections;
    
    namespace ConsoleApplication2
    {
        public class Program
        {
            public static void Main()
            {
                int[] a = { 11, 2, 14, 1, 7, 15, 5, 8 };
    
                RBTree<int> rbTree = new RBTree<int>();
                foreach (var item in a)
                {
                    rbTree.Insert(item);
                }
                rbTree.PreOrder();
                Console.WriteLine();
                rbTree.Insert(4);
                Console.WriteLine();
                rbTree.PreOrder();
    
                Console.Read();
            }
        }
    
        public enum NodeColor
        {
            Black,
            Red
        }
    
        public class RBTreeNode<T> where T : IComparable
        {
            public T Key { get; set; }
            public NodeColor Color { get; set; }
            public RBTreeNode<T> Parent { get; set; }
            public RBTreeNode<T> LeftNode { get; set; }
            public RBTreeNode<T> RightNode { get; set; }
    
    
            public RBTreeNode(T key, NodeColor color, RBTreeNode<T> parent, RBTreeNode<T> leftNode, RBTreeNode<T> rightNode)
            {
                this.Key = key;
                this.Color = color;
                this.Parent = parent;
                this.LeftNode = leftNode;
                this.RightNode = rightNode;
            }
    
            public override string ToString()
            {
                return this.Key + "(" + Color.ToString() + ")";
            }
        }
    
    
        public class RBTree<T> where T : IComparable
        {
            public RBTreeNode<T> RootNode { get; set; }
    
            public void Insert(T key)
            {
                if (RootNode == null)
                {
                    RootNode = new RBTreeNode<T>(key, NodeColor.Black, null, null, null);
                }
                else
                {
                    var newNode = Inserts(key);
                    InsertFixUp(newNode);
                }
            }
    
    
            private RBTreeNode<T> Inserts(T key)
            {
                var node = RootNode;
    
                var newNode = new RBTreeNode<T>(key, NodeColor.Red, null, null, null);
                while (true)
                {
                    if (key.CompareTo(node.Key) > 0)
                    {
                        if (node.RightNode == null)
                        {
                            newNode.Parent = node;
                            node.RightNode = newNode;
                            break;
                        }
                        node = node.RightNode;
                    }
                    else if (key.CompareTo(node.Key) < 0)
                    {
                        if (node.LeftNode == null)
                        {
                            newNode.Parent = node;
                            node.LeftNode = newNode;
                            break;
                        }
                        node = node.LeftNode;
                    }
                }
                return newNode;
            }
    
    
            private void InsertFixUp(RBTreeNode<T> node)
            {
                var parentNode = node.Parent;
                if (parentNode != null && NodeColor.Red == parentNode.Color)
                {
                    var gparentNode = parentNode.Parent;
                    if (parentNode == gparentNode.LeftNode)
                    {
                        var uncleNode = gparentNode.RightNode;
                        if (uncleNode != null && NodeColor.Red == uncleNode.Color)//case1
                        {
                            SetBlack(parentNode);
                            SetBlack(uncleNode);
                            SetRed(gparentNode);
                            InsertFixUp(gparentNode);
                        }
                        else
                        {
                            if (parentNode.RightNode == node)//case2
                            {
                                LeftRotation(parentNode);
                                InsertFixUp(parentNode);
                            }
                            else if (parentNode.LeftNode == node)//case3
                            {
                                SetBlack(parentNode);
                                SetRed(gparentNode);
                                RightRotion(gparentNode);
                            }
                        }
                    }
                    else
                    {
                        var uncleNode = gparentNode.LeftNode;
                        if (uncleNode != null && NodeColor.Red == uncleNode.Color)//case1
                        {
                            SetBlack(parentNode);
                            SetBlack(uncleNode);
                            SetRed(gparentNode);
                            InsertFixUp(gparentNode);
                        }
                        else
                        {
                            if (parentNode.LeftNode == node)//case2
                            {
                                RightRotion(parentNode);
                                InsertFixUp(parentNode);
                            }
                            else if (parentNode.RightNode == node)//case3
                            {
                                SetBlack(parentNode);
                                SetRed(gparentNode);
                                LeftRotation(gparentNode);
                            }
                        }
                    }
                }
                SetBlack(RootNode);//直接将根节点设置为黑色
            }
    
    
            private void LeftRotation(RBTreeNode<T> node)
            {
                RBTreeNode<T> temp = node.RightNode;
    
                node.RightNode = temp.LeftNode;
                if (temp.LeftNode != null)
                {
                    temp.LeftNode.Parent = node;
                }
    
                temp.Parent = node.Parent;
    
                if (node.Parent == null)
                {
                    RootNode = temp;
                }
                else
                {
                    if (node.Parent.LeftNode == node)
                    {
                        node.Parent.LeftNode = temp;
                    }
                    else
                    {
                        node.Parent.RightNode = temp;
                    }
                }
                temp.LeftNode = node;
                node.Parent = temp;
            }
    
            private void RightRotion(RBTreeNode<T> node)
            {
                RBTreeNode<T> temp = node.LeftNode;
    
                node.LeftNode = temp.RightNode;
                if (temp.RightNode != null)
                {
                    temp.RightNode.Parent = node;
                }
    
                temp.Parent = node.Parent;
    
                if (node.Parent == null)
                {
                    RootNode = temp;
                }
                else
                {
                    if (node == node.Parent.RightNode)
                    {
                        node.Parent.RightNode = temp;
                    }
                    else
                    {
                        node.Parent.LeftNode = temp;
                    }
                }
                temp.RightNode = node;
                node.Parent = temp;
            }
    
    
            private void SetBlack(RBTreeNode<T> node)
            {
                node.Color = NodeColor.Black;
            }
    
            private void SetRed(RBTreeNode<T> node)
            {
                node.Color = NodeColor.Red;
            }
    
            public void LevelOrder()
            {
                LevelOrder(RootNode);
            }
    
            private void LevelOrder(RBTreeNode<T> note)
            {
                Queue<RBTreeNode<T>> queue = new Queue<RBTreeNode<T>>();
                queue.Enqueue(note);
    
                while (queue.Count > 0)
                {
                    var temp = queue.Dequeue();
    
                    Console.Write(temp + " ");
    
                    if (temp.LeftNode != null)
                    {
                        queue.Enqueue(temp.LeftNode);
                    }
    
                    if (temp.RightNode != null)
                    {
                        queue.Enqueue(temp.RightNode);
                    }
                }
            }
    
            public void PreOrder()
            {
                PreOrder(RootNode);
            }
    
            private void PreOrder(RBTreeNode<T> node)
            {
                Console.Write(node + " ");
    
                if (node.LeftNode != null)
                {
                    PreOrder(node.LeftNode);
                }
    
                if (node.RightNode != null)
                {
                    PreOrder(node.RightNode);
                }
            }
        }
    }
  • 相关阅读:
    spark学习进度11(RDD分区和我shuffle以及缓存)
    spark学习进度10(阶段练习)
    gradle体验笔记
    git 进阶命令
    git 基础命令
    看日记学git--笔记
    git的objects目录
    macos中gitk报错
    第5章 迪米特法则(最少知知识原则)
    操作系统概念 第9版
  • 原文地址:https://www.cnblogs.com/bbvi/p/5070560.html
Copyright © 2011-2022 走看看