Как создать рекурсивный метод для генерации двоичного дерева? - PullRequest
1 голос
/ 14 октября 2019

Проблема возникает, когда рекурсивная итерация справа достигает состояния 2 и возвращается, поскольку отец принимает значение, которое он не должен.

Это мой класс создателя узла, который имеет право и левосторона, чтобы пойти:

public class TreeNodo{
    public byte vectorPosible[]; 
    public int stage; //my stages and index posision of array

    public TreeNodo right; // if goes to right mean 1, in index posision of array
    public TreeNodo left; // if goes to right mean 0, in the index posision of array

    //contructor
    public TreeNodo(byte vectorPosible[], int currentStage){
        this.vectorPosible=vectorPosible;
        this.stage=currentStage; 
        this.right=null;
        this.left=null;
    }
}

Это мой рекурсивный класс, он инициализирует конструктор и в этот момент я запускаю рекурсию:

public class SolutionTree{

TreeNodo root; //it saves the vector [-1,-1] that its initial stage

//contructor 
public SolutionTree(byte vectorPosible[], int currentStage){
    this.root=new TreeNodo(vectorPosible, currentStage);
    this.generarTreePSR(root, vectorPosible, vectorPosible.length, currentStage+1); //Generate a Tree of Possible Solutions Recursively
}

//Metod to insert Tree Node Recursively

public static void generarTreePSR(TreeNode father,byte vectorPosible[],int maxStage, int currentStage){  //in this case maxStage is 2

    TreeNode newNode= new TreeNode(vectorPosible, currentStage);
    System.out.println("newNode.left: "+(newNode.left==null));
    System.out.println("newNode.right: "+(newNode.right==null));
    System.out.println();       

    System.out.println("newNode stage: "+newNode.stage);

    if(newNode.stage==maxStage){ //BASE CASE, IF STAGE == 2
        System.out.println("Reached this stage max: "+newNode.stage);
        System.out.println("I return");
        return;
    }else{ // it isn't in the base case, so tree follow growing

        System.out.print("Look i'm father and i'm before of left, my vector is: ");
        for (int j=0;j<father.vectorPosible.length;j++) { //i show the father vector's
            System.out.print(father.vectorPosible[j]);
            System.out.print(" ");
        }
        System.out.println();


        System.out.println("I'm before if Left, and it is: "+(father.left==null));
        if(father.left==null){
                newNode.vectorPosible[newNode.stage]=0; //insert 0
                father.left=newNode; //asign node

                for (int j=0;j<father.left.vectorPosible.length;j++) { //i show what i insert into this left node
                    System.out.print(father.left.vectorPosible[j]);
                    System.out.print(" ");
                }
                System.out.println();
                System.out.println("Nodo added left with success");
                System.out.println();
                generarTreePSR(father.left, father.left.vectorPosible, maxStage, currentStage+1);
        }

        System.out.print("Look i'm father and i'm before of right, my vector is: ");
        for (int j=0;j<father.vectorPosible.length;j++) { //i show the father vector's
            System.out.print(father.vectorPosible[j]);
            System.out.print(" ");
        }
        System.out.println();

        System.out.println("I'm before if Right, and it is: "+(father.right==null));
        if(father.right==null){
                newNode.vectorPosible[newNode.stage]=1; //insert 1
                father.right=newNode; //asign node

                for (int j=0;j<father.right.vectorPosible.length;j++) {  //i show what i insert into this right node
                    System.out.print(father.right.vectorPosible[j]);
                    System.out.print(" ");
                }
                System.out.println();
                System.out.println("Nodo added right with success");
                System.out.println();
                generarTreePSR(father.right, father.right.vectorPosible, maxStage, currentStage+1);
        }
        return;
    }
}
}

Это мой основной класс, чтобы запустить его свектор, что я хочу:

public class TryTree{

public static void main(String[] args) {

    byte vectorPosibles[]={-1,-1};
    SolutionTree tree=new SolutionTree(vectorPosibles); //tree of posible solutions and it need to pass a vector [-1,-1]

  }
}

Он не генерирует все узлы, которые мне нужны. Посмотрите изображение со всеми узлами: Изображение с узлами, что мне нужно , int Мне нужно сделать это рекурсивно, а не со сканированием.

1 Ответ

0 голосов
/ 20 октября 2019

Чтобы это работало, вам нужно использовать это в конструкторе TreeNode: System.arraycopy (vectorPosible, 0, this.vectorPosible, 0, vectorPosible.length);

Тогда код будет выглядеть следующим образом:

 public class TreeNodo{
    public byte vectorPosible[]; 
    public int stage; //my stages and index posision of array

    public TreeNodo right; // if goes to right mean 1, in index posision of array
    public TreeNodo left; // if goes to right mean 0, in the index posision of array

    //contructor
    public TreeNodo(byte vectorPosible[], int currentStage){
      this.vectorPosible=vectorPosible;
      this.stage=currentStage; 
      this.right=null;
      this.left=null;
  }
}

В дополнение к этому вы должны объявить два новыхNode (1 и 2) в SolutionTree, потому что если вы объявите один, он будетссылаются с тем же вектором. Тогда код будет выглядеть так:

public class SolutionTree{

  TreeNodo root; //it saves the vector [-1,-1] that its initial stage

  //contructor 
  public SolutionTree(byte vectorPosible[], int currentStage){
      this.root=new TreeNodo(vectorPosible, currentStage);
      this.generarTreePSR(root, vectorPosible, vectorPosible.length, currentStage+1); //Generate a Tree of Possible Solutions Recursively
  }

  //Metod to insert Tree Node Recursively

  public static void generarTreePSR(TreeNode father,byte vectorPosible[],int maxStage, int currentStage){  //in this case maxStage is 2

    if(currentStage==maxStage){ //BASE CASE, IF STAGE == 2
      System.out.println("Reached this stage max: "+currentStage);
      System.out.println("I return");
      return;
    }else{ // it isn't in the base case, so tree follow growing

      //NEW TREE NODE1
        TreeNode newNode1=new TreeNode(father.getVectorPos(), currentStage); //<------Solucion
        newNode1.stage=currentStage;

      //NEW TREE NODE2
        TreeNode newNode2= new TreeNode(father.getVectorPos(), currentStage); //<------Solucion
        newNode2.stage=currentStage;


      System.out.print("Look i'm father and i'm before of left, my vector is: ");
      for (int j=0;j<father.vectorPosible.length;j++) { //i show the father vector's
          System.out.print(father.vectorPosible[j]);
          System.out.print(" ");
      }
      System.out.println();


      System.out.println("I'm before if Left, and it is: "+(father.left==null));
      if(father.left==null){
              newNode.vectorPosible[newNode.stage]=0; //insert 0
              father.left=newNode; //asign node

              for (int j=0;j<father.left.vectorPosible.length;j++) { //i show what i insert into this left node
                  System.out.print(father.left.vectorPosible[j]);
                  System.out.print(" ");
              }
              System.out.println();
              System.out.println("Nodo added left with success");
              System.out.println();
              generarTreePSR(father.left, father.left.vectorPosible, maxStage, currentStage+1);
    }

      System.out.print("Look i'm father and i'm before of right, my vector is: ");
      for (int j=0;j<father.vectorPosible.length;j++) { //i show the father vector's
          System.out.print(father.vectorPosible[j]);
          System.out.print(" ");
      }
      System.out.println();

      System.out.println("I'm before if Right, and it is: "+(father.right==null));
      if(father.right==null){
              newNode.vectorPosible[newNode.stage]=1; //insert 1
              father.right=newNode; //asign node

              for (int j=0;j<father.right.vectorPosible.length;j++) {  //i show what i insert into this right node
                  System.out.print(father.right.vectorPosible[j]);
                  System.out.print(" ");
              }
              System.out.println();
              System.out.println("Nodo added right with success");
              System.out.println();
              generarTreePSR(father.right, father.right.vectorPosible, maxStage, currentStage+1);
      }
      return;
  }
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...