使用二叉树将Infix转换为Postfix

时间:2014-11-20 22:16:41

标签: c# algorithm data-structures

我正在尝试将中缀转换为postfix转换器。我已经在谷歌中搜索了代码,但大多数算法都是使用堆栈或使用正则表达式或难以理解的,但我想用二叉树来实现这一点。

这是我已经做过的事情:

班级节点:

public class Node
{
    private object element;
    private Node left;
    private Node right;
    private Node parent;

    public Node()
    {
    }

    public Node(object x, Node r, Node l)
    {
        element = x;
        right = r;
        left = l;
    }

    public object GetElement()
    {
        return element;
    }

    public void SetElement(object x)
    {
        element = x;
    }

    public Node GetLeft()
    {
        return left;
    }

    public void SetLeft(Node l)
    {
        left = l;
    }

    public Node GetRight()
    {
        return right;
    }

    public void SetRight(Node r)
    {
        right = r;
    }

    public Node GetParent()
    {
        return parent;
    }

    public void SetParent(Node p)
    {
        parent = p;
    }
}

很抱歉使用get / set而不是简单的自动属性。

和我的BST类有Insert,Postfix,Prefix和Infix方法(我也写过搜索,deletemin等,但我们的问题不需要它们)

BST班级:

public class BinarySearchTree
{
    //Node r: root.
    public void Insert(Node r, Node p, object x)
    {
        if (r == null)
        {
            r = new Node(x, null, null);
            r.SetParent(p);
            if ((int)x < (int)p.GetElement())
                p.SetLeft(r);
            else if ((int)x > (int)p.GetElement())
                p.SetRight(r);
        }
        if ((int) x < (int) r.GetElement())
            Insert(r.GetLeft(), r, x);
        else if ((int) x > (int) r.GetElement())
            Insert(r.GetRight(), r, x);
    }

    public void PreOrder(Node p)
    {
        if (p != null)
        {
            Console.WriteLine(p.GetElement());
            PreOrder(p.GetLeft());
            PreOrder(p.GetRight());
        }
    }

    public void Inorder(Node p)
    {
        if (p != null)
        {
            Inorder(p.GetLeft());
            Console.WriteLine(p.GetElement());
            Inorder(p.GetRight());
        }
    }

    public void Postorder(Node p)
    {
        if (p != null)
        {
            Postorder(p.GetLeft());
            Postorder(p.GetRight());
            Console.WriteLine(p.GetElement());
        }
    }
}

我的插入方法适用于数字,例如:
如果我们想写下面树的顺序,预购和发布顺序

enter image description here

预购:5,3,2,4,7,6,12 后序:2,4,3,6,12,7,5 依次为:2,3,4,5,6,7,12

此示例的主要方法:

private static void Main()
{
    BinarySearchTree bst = new BinarySearchTree();
    Node r = new Node(5, null, null);
    bst.Insert(r, null, 3);
    bst.Insert(r, null, 7);
    bst.Insert(r, null, 4);
    bst.Insert(r, null, 12);
    bst.Insert(r, null, 2);
    bst.Insert(r, null, 6);
    bst.Inorder(r);
    Console.WriteLine();
    bst.Postorder(r);
    Console.WriteLine();
    bst.PreOrder(r);
}

现在我想制作一个infix到postfix转换器,但不知道如何实现插入方法,以及如何按顺序处理运算符和操作数。另一个问题是括号 如果能帮我一些代码,我将不胜感激。

树的例子:

enter image description here

mathblog有一个中缀到后缀转换器,你可以用它来检查你的 http://www.mathblog.dk/tools/infix-postfix-converter/

1 个答案:

答案 0 :(得分:0)

看起来将表达式从中缀转换为后缀表示法的最简单方法是使用基于标准堆栈的算法(它具有线性时间复杂度,因此它是最优的)然后构建树(从后缀构造树)表达式很简单,因为所有运算符的顺序都正确。)