Распечатать предварительный заказ BST на этикетке Windows Form

Возможно, это очень простой вопрос, но я понятия не имею, что делать с Forms.

Мне нужно вызвать метод обхода предварительного заказа (реализованный в другом классе) в коде Winform, чтобы предварительный заказ был напечатан в метке интерфейса формы.

Итак, у меня есть класс BST, в котором есть метод обхода дерева в Preorder. Также есть способ вставки значения в дерево. Вот так:

namespace BinaryTree //the BST's class
{
   public partial class BinarySearchTreeNode<T> where T : IComparable<T>
   {


public void Insert(T value) //method for inserting
    {
       ....
    }

public IEnumerable<T> Preorder() //method for Preorder traversal
    {
        List<T> preOrdered= new List<T>();
        if (_value != null)
        {
            preOrdered.Add(Value);

            if (LeftChild != null) //
            {
                preOrdered.AddRange(LeftChild.Preorder());
            }

            if (RightChild != null) //
            {
                preOrdered.AddRange(RightChild.Preorder());
            }
        }
        return preOrdered;
    }
}

Теперь для использования этих операций у меня есть интерфейс Windows Forms. В нем есть код для Создания нового дерева, для Добавления значения в дерево (путем ввода значения в inputTextBox и нажатия кнопки btnCreate) и Показать дерево для пользователю (через PaintTree), но мне также нужно распечатать предварительный заказ дерева пользователю (например, в метке в интерфейсе).

Скажем, у меня есть метка в интерфейсе под названием «PreorderLabel» для этого; здесь я хочу, чтобы предварительный заказ был напечатан.

Код формы выглядит так:

namespace BinaryTree
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private BinarySearchTree<int> _tree;


    void PaintTree()
    {
        if (_tree == null) return;
        pictureBox1.Image = _tree.Draw();
    }




    private void btnCreate_Click(object sender, EventArgs e)
    {
        try
        {
            _tree = new BinarySearchTree<int>(new BinarySearchTreeNode<int>(int.MinValue));
            PaintTree();
        }

        catch(NotImplementedException) { MessageBox.Show("There is no implementation!"); }
    }


    private void btnAdd_Click(object sender, EventArgs e)
    {
        try
        {
            var val = int.Parse(inputTextBox.Text);  //makes a variable out of the input value from the user, to work with
            if (_tree == null)
                btnCreate_Click(btnCreate, new EventArgs());
            _tree.Insert(val);  //***calls the "Insert" method from the BST class, to insert the value to the tree
            PaintTree();  //shows the user the tree

//**this is [I guess] where I need code for printing the tree in Preorder**
           PreorderLabel.Text = ???????

            inputTextBox.SelectAll();
            this.Update();
        }

        catch (Exception exp) { MessageBox.Show(exp.Message); }
    }

Таким образом, когда пользователь нажимает кнопку «Добавить» (btnAdd), не только вызывается метод Insert для дерева «_tree», но и вызывается метод PaintTree для отображения дерева; но также вызывается метод Preorder для печати Preorder в метке PreorderLabel.

Как это сделать?

Буду очень рад любой помощи!


person mbksr    schedule 04.05.2016    source источник
comment
Код метода обхода предварительного заказа показан в первой вставке кода? Или же?   -  person mbksr    schedule 04.05.2016
comment
Что ж, это не сверхлегкий вопрос, главным образом потому, что неясно, что вы подразумеваете под печатью в ярлыке. Ярлык — это просто статический текст, что на самом деле вы хотите напечатать там?   -  person Ivan Stoev    schedule 04.05.2016
comment
Извиняюсь. Я думаю о чем-то вроде изменения label.Text в строку узлов дерева в предварительном порядке каждый раз, когда пользователь добавляет значение, вот что я хотел бы напечатать там.   -  person mbksr    schedule 04.05.2016


Ответы (1)


Вы можете использовать метод String.Join(string separator, IEnumerable<string> values) со строкой разделителя, как показано ниже:

PreorderLabel.Text = String.Join("; ", _tree.PreOrder().Select(item => item.ToString()));

Метод PreOrder() вернет экземпляр IEnumerable<int>, поэтому нам нужно только преобразовать int значений в string.

person Gabor    schedule 04.05.2016