コード例 #1
0
ファイル: RBTree.cs プロジェクト: Hengle/JellyTerain
        private int find_key <T>(T key, List <Node> path)
        {
            INodeHelper <T> nodeHelper = (INodeHelper <T>)hlp;
            int             num        = 0;
            Node            node       = null;
            Node            node2      = root;

            path?.Add(root);
            while (node2 != null)
            {
                num = nodeHelper.Compare(key, node2);
                if (num == 0)
                {
                    return(num);
                }
                if (num < 0)
                {
                    node  = node2.right;
                    node2 = node2.left;
                }
                else
                {
                    node  = node2.left;
                    node2 = node2.right;
                }
                if (path != null)
                {
                    path.Add(node);
                    path.Add(node2);
                }
            }
            return(num);
        }
コード例 #2
0
ファイル: RBTree.cs プロジェクト: tralivali1234/OLinq
        public Node Lookup <T>(T key)
        {
            INodeHelper <T> hlp     = (INodeHelper <T>) this.hlp;
            Node            current = root;

            while (current != null)
            {
                int c = hlp.Compare(key, current);
                if (c == 0)
                {
                    break;
                }
                current = c < 0 ? current.left : current.right;
            }
            return(current);
        }
コード例 #3
0
ファイル: RBTree.cs プロジェクト: Hengle/JellyTerain
        public Node Lookup <T>(T key)
        {
            INodeHelper <T> nodeHelper = (INodeHelper <T>)hlp;
            Node            node;
            int             num;

            for (node = root; node != null; node = ((num >= 0) ? node.right : node.left))
            {
                num = nodeHelper.Compare(key, node);
                if (num == 0)
                {
                    break;
                }
            }
            return(node);
        }
コード例 #4
0
ファイル: RBTree.cs プロジェクト: tralivali1234/OLinq
        // Get an enumerator that starts at 'key' or the next higher element in the tree
        public NodeEnumerator GetSuffixEnumerator <T>(T key)
        {
            var             pennants = new Stack <Node>();
            INodeHelper <T> hlp      = (INodeHelper <T>) this.hlp;
            Node            current  = root;

            while (current != null)
            {
                int c = hlp.Compare(key, current);
                if (c <= 0)
                {
                    pennants.Push(current);
                }
                if (c == 0)
                {
                    break;
                }
                current = c < 0 ? current.left : current.right;
            }
            return(new NodeEnumerator(this, pennants));
        }
コード例 #5
0
ファイル: RBTree.cs プロジェクト: tralivali1234/OLinq
        // Pre-condition: root != null
        int find_key <T>(T key, List <Node> path)
        {
            INodeHelper <T> hlp     = (INodeHelper <T>) this.hlp;
            int             c       = 0;
            Node            sibling = null;
            Node            current = root;

            if (path != null)
            {
                path.Add(root);
            }

            while (current != null)
            {
                c = hlp.Compare(key, current);
                if (c == 0)
                {
                    return(c);
                }

                if (c < 0)
                {
                    sibling = current.right;
                    current = current.left;
                }
                else
                {
                    sibling = current.left;
                    current = current.right;
                }

                if (path != null)
                {
                    path.Add(sibling);
                    path.Add(current);
                }
            }

            return(c);
        }
コード例 #6
0
ファイル: RBTree.cs プロジェクト: tralivali1234/OLinq
        public void Bound <T>(T key, ref Node lower, ref Node upper)
        {
            INodeHelper <T> hlp     = (INodeHelper <T>) this.hlp;
            Node            current = root;

            while (current != null)
            {
                int c = hlp.Compare(key, current);
                if (c <= 0)
                {
                    upper = current;
                }
                if (c >= 0)
                {
                    lower = current;
                }
                if (c == 0)
                {
                    break;
                }
                current = c < 0 ? current.left : current.right;
            }
        }