BinaryTreeSearch PostOrder遍历和搜索

时间:2018-07-31 08:35:08

标签: c# algorithm yield

大家好帮我。 我为二进制搜索树编写了代码,但是由于某种原因,我在遍历和搜索中非常愚蠢。有人可以帮忙写订单和搜索吗? 谢谢,抱歉英语不好。再次非常感谢你。

我没有向您展示我的Remove and Contains方法,因为它并不重要。如果您想看到它们,我可以显示出来。

我的BinaryTreeNode类

public class BinaryTreeNode<T> : IComparable<T>
    where T : IComparable
{
    public BinaryTreeNode(T value)
    {
        Value = value;
    }

    public BinaryTreeNode<T> Left { get; set; }
    public BinaryTreeNode<T> Right { get; set; }
    public T Value { get; }

    public int CompareTo(T other)
    {
        return Value.CompareTo(other);
    }

    public IEnumerator<T> GetEnumerator()
    {
        var leftEnumerable = (IEnumerable<T>) Left ?? new T[0];
        var rightEnumerable = (IEnumerable<T>) Right ?? new T[0];

        return leftEnumerable.Concat(new[] {Value})
            .Concat(rightEnumerable)
            .GetEnumerator();
    }
}

我的BinaryTree类:

 public class BinaryTree<T>
    where T : IComparable
{
    private BinaryTreeNode<T> _head;

    public int Count { get; private set; }


    public void Add(T value)
    {
        if (_head == null)
            _head = new BinaryTreeNode<T>(value);
        else
            AddTo(_head, value);

        Count++;
    }

    private void AddTo(BinaryTreeNode<T> node, T value)
    {
        if (value.CompareTo(node.Value) < 0)
        {
            if (node.Left == null)
                node.Left = new BinaryTreeNode<T>(value);
            else
                AddTo(node.Left, value);
        }
        else
        {
            if (node.Right == null)
                node.Right = new BinaryTreeNode<T>(value);
            else
                AddTo(node.Right, value);
        }
    }

    public IEnumerable<T> Preorder(BinaryTreeNode<T> root)
    {
        var stack = new Stack<BinaryTreeNode<T>>();
        stack.Push(root);

        while (stack.Count > 0)
        {
            var node = stack.Pop();
            yield return node.Value;
            if (node.Right != null)
                stack.Push(node.Right);
            if (node.Left != null)
                stack.Push(node.Left);
        }
    }

    public IEnumerable<T> InOrder(BinaryTreeNode<T> root)
    {
        var stack = new Stack<BinaryTreeNode<T>>();
        while (root != null)
        {
            while (root.Left != null)
            {
                stack.Push(root);
                root = root.Left;
            }

            yield return root.Value;

            while (root.Right == null && stack.Count > 0)
            {
                root = stack.Pop();
                yield return root.Value;
            }

            root = root.Right;
        }
    }


    public IEnumerator<T> GetEnumerator()
    {
        return _head.GetEnumerator();
    }

    public void Clear()
    {
        _head = null;
        Count = 0;
    }
}

0 个答案:

没有答案