Как мне правильно добавлять символы в строку при рекурсии

#java #string #recursion

#java #строка #рекурсия

Вопрос:

Итак, у меня есть эта функция EDIT: вся программа в соответствии с запросом

 //This is a java program to construct Expression Tree using Infix Expression
import java.io.*;
public class Infix_Expression_Tree
{
    public static void main(String args[]) throws IOException
    {
        
        String result="";
       
        File vhod = new File(args[0]);
        try{
            BufferedReader reader = new BufferedReader(new FileReader(vhod));
        
            Tree t1 = new Tree();
            
            String a = reader.readLine();
            t1.insert(a);
            t1.traverse(1,result);
            System.out.println("rez "  result);
           
            ch = reader.readLine();
    
    }catch(IOException e){
            e.printStackTrace();
        }
    }
}
 
class Node
{
    public char data;
    public Node leftChild;
    public Node rightChild;
 
    public Node(char x)
    {
        data = x;
    }
 
    public void displayNode()
    {
        System.out.print(data);
    }
}
 
class Stack1
{
    private Node[] a;
    private int    top, m;
 
    public Stack1(int max)
    {
        m = max;
        a = new Node[m];
        top = -1;
    }
 
    public void push(Node key)
    {
        a[  top] = key;
    }
 
    public Node pop()
    {
        return (a[top--]);
    }
 
    public boolean isEmpty()
    {
        return (top == -1);
    }
}
 
class Stack2
{
    private char[] a;
    private int    top, m;
 
    public Stack2(int max)
    {
        m = max;
        a = new char[m];
        top = -1;
    }
 
    public void push(char key)
    {
        a[  top] = key;
    }
 
    public char pop()
    {
        return (a[top--]);
    }
 
    public boolean isEmpty()
    {
        return (top == -1);
    }
}
 
class Conversion
{
    private Stack2 s;
    private String input;
    private String output = "";
 
    public Conversion(String str)
    {
        input = str;
        s = new Stack2(str.length());
    }
 
    public String inToPost()
    {
        for (int i = 0; i < input.length(); i  )
        {
            char ch = input.charAt(i);
            switch (ch)
            {
                case ' ':
                    gotOperator(ch, 2);
                    break;
                case '*':
                    gotOperator(ch,1);
                    break;
                case '/':
                    gotOperator(ch, 3);
                    break;
                case '(':
                    s.push(ch);
                    break;
                case ')':
                    gotParenthesis();
                    //s.pop();
                    break;
                default:
                    //gotOperator(ch, 0);
                //break;
                   output = output   ch;
            }
        }
        while (!s.isEmpty())
            output = output   s.pop();

        //System.out.println("to je output iz inToPost "  output);
        return output;
    }
 
    private void gotOperator(char opThis, int prec1)
    {
        while (!s.isEmpty())
        {
            char opTop = s.pop();
            if (opTop == '(')
            {
                s.push(opTop);
                break;
            } else
            {
                int prec2;
                if (opTop == ' ')
                    prec2 = 2;
                else if(opTop=='*')
                    prec2=1;
                else
                    prec2 = 3;
                if (prec2 <= prec1)
                {
                    s.push(opTop);
                    break;
                } else
                    output = output   opTop;
            }
        }
        s.push(opThis);
    }
 
    private void gotParenthesis()
    {
        while (!s.isEmpty())
        {
            char ch = s.pop();
            if (ch == '(')
                break;
            else
                output = output   ch;
        }
    }
}
 
class Tree
{
    private Node root;
 
    public Tree()
    {
        root = null;
    }
 
    public void insert(String s)
    {
        Conversion c = new Conversion(s);
        s = c.inToPost();
        
        Stack1 stk = new Stack1(s.length());
        s = s   "#";
        int i = 0;
        char symbol = s.charAt(i);
        Node newNode;
        while (symbol != '#')
        {
            if (symbol >= '0' amp;amp; symbol <= '9' || symbol >= 'A'
                    amp;amp; symbol <= 'Z' || symbol >= 'a' amp;amp; symbol <= 'z')
            {
                newNode = new Node(symbol);
                stk.push(newNode);
            } else if (symbol == ' ' || symbol == '/'
                    || symbol == '*')
            {
                Node ptr1=null;
                Node ptr2=null;
                //if(!stk.isEmpty()){
                ptr1 = stk.pop();
                if(!stk.isEmpty()){
                ptr2 = stk.pop();
                }
                //}
                newNode = new Node(symbol);
                newNode.leftChild = ptr2;
                newNode.rightChild = ptr1;
                stk.push(newNode);
            }
            /*else if(symbol=='/'){
                Node ptr = stk.pop();
                newNode = new Node(symbol);
                newNode.leftChild = ptr;
                newNode.rightChild=null;
                stk.push(newNode);

            }*/
            symbol = s.charAt(  i);
        }
        root = stk.pop();
    }
 
    public void traverse(int type,String result)
    {
        
                System.out.println("Preorder Traversal:-    ");
                preOrder(root,result);
             
    }
 
    private void preOrder(Node localRoot, String result)
    {   
        if(root==null){
            return;
        }
        
        if (localRoot != null)
        {
            if(localRoot.data == '/'){
            preOrder(localRoot.leftChild,result);
            result=result   localRoot.data;
            //StringBuilder stringBuilder1 = new StringBuilder();
            //stringBuilder1.append(result).append(localRoot.data);
            System.out.println(result);
            //localRoot.displayNode();
            preOrder(localRoot.rightChild,result);
            return;

           
        }else{
             //System.out.println("trenutni root je" );
             //localRoot.displayNode();
             result=result   localRoot.data;
            // StringBuilder stringBuilder1 = new StringBuilder();
            //stringBuilder1.append(result).append(localRoot.data);
            System.out.println(result);
             preOrder(localRoot.leftChild,result);
             //result=result   localRoot.data;
             //System.out.print(root.data);
             preOrder(localRoot.rightChild,result);
            
            //System.out.print(root.data);
            //preOrder(localRoot.rightChild);
            return;
            }
        }
    }
}
 

моя проблема с этим заключается в том, что с localRoot.DisplayNode() я получаю желаемый результат. Но когда я добавляю то же самое к результату строки, он добавляет данные, пока я не доберусь до листа дерева (у листа нет левого / правого дочернего элемента), поэтому он возвращается к предыдущему рекурсивному вызову и переходит к правому дочернему элементу, здесь где-то лист (из которого мы вернулись) не находится в строке больше нет. Как мне это исправить?

Строка определяется в основном методе

Комментарии:

1. Не могли бы вы, пожалуйста, опубликовать код всего класса? Мы не можем видеть определение для root , и result . Также было бы полезно посмотреть, как Node.leftChild определяются и Node.rightChild определяются. Пожалуйста, опубликуйте также свой основной метод с вызовом preOrder() .

2. Кроме того, пожалуйста, точно опишите, что preOrder() вы должны делать. Приведите пример входных данных и чего вы ожидаете от этого метода.

3. Я обновил сообщение, я добавил целую программу, чтобы вы могли видеть, откуда берется материал

4. Просто примечание, какова ваша главная цель? Вы хотите анализировать выражения? Если это так, я бы рекомендовал использовать библиотеку синтаксического анализа. Я лично использую ANTLR4, что потрясающе, но есть и другие. Простую грамматику выражений можно найти здесь . Используя ANTLR4, вы действительно можете сэкономить много времени на написание и отладку.

5. Пожалуйста, отправьте также файл входных данных.