Exemple #1
0
        private IEnumerator <T> GetPostOrderEnumerator()
        {
            Stack <AvlNode <T> > stack       = new Stack <AvlNode <T> >();
            AvlNode <T>          current     = Root;
            AvlNode <T>          lastVisited = null;

            while (current.IsNotNull())
            {
                for (; current.Left.IsNotNull(); current = current.Left)
                {
                    stack.Push(current);
                }

                while (current.IsNotNull() && (current.Right.IsNull() || current.Right == lastVisited))
                {
                    yield return(current.Item);

                    lastVisited = current;
                    if (stack.IsEmpty)
                    {
                        yield break;
                    }
                    current = stack.Pop();
                }
                stack.Push(current);
                current = current.Right;
            }
        }
Exemple #2
0
        // T(n) = O(n); S(n) = O(h) (height)
        private IEnumerator <T> GetInOrderEnumerator()
        {
            Stack <AvlNode <T> > stack   = new Stack <AvlNode <T> >();
            AvlNode <T>          current = Root;

            while (current.IsNotNull() || !stack.IsEmpty)
            {
                while (current.IsNotNull())
                {
                    stack.Push(current);
                    current = current.Left;
                }
                if (!stack.IsEmpty)
                {
                    current = stack.Pop();
                    yield return(current.Item);

                    current = current.Right;
                }
            }
        }
Exemple #3
0
        protected AvlNode <T> FindMin(AvlNode <T> tree)
        {
            if (tree.IsNotNull())
            {
                while (tree.Left.IsNotNull())
                {
                    tree = tree.Left;
                }
            }

            return(tree);
        }
Exemple #4
0
        protected AvlNode <T> FindMax(AvlNode <T> tree)
        {
            if (tree.IsNotNull())
            {
                while (tree.Right.IsNotNull())
                {
                    tree = tree.Right;
                }
            }

            return(tree);
        }
Exemple #5
0
        private AvlNode <T> Find(AvlNode <T> node, T item)
        {
            AvlNode <T> current = node;

            while (current.IsNotNull())
            {
                if (current.Item.CompareTo(item) == 0)
                {
                    return(current); // Match
                }
                else if (current.Item.CompareTo(item) > 0)
                {
                    current = current.Left;
                }
                else
                {
                    current = current.Right;
                }
            }

            return(null); // Not found.
        }