2013-07-21 6 views
0

Я довольно новичок в java, и для одного из наших назначений мне требуется создать двоичное дерево, содержащее узлы с значениями int. Мой профессор хочет, чтобы мы использовали один класс, содержащий основной метод. Я применил два рекурсивных метода, один для вставки узла и один для отображения существующих узлов. Однако, когда я запускаю свой код, консоль отображает только самый последний узел, который я ввел. Что-то не так с методами, которые я использовал? Это то, что я до сих пор:Java: методы рекурсии двоичного дерева

import java.util.Scanner; 
public class node { 

private int value; 
static node root; 
public node leftLink; 
public node rightLink; 

public node(int v) 
{ 
    this.value = v; 
} 

public int getValue() 
{ 
    return value; 
} 

static void traverseShow() 
{ 
    if(root.leftLink != null){ 
     root = root.leftLink; 
     traverseShow(); 
    } 
    System.out.println(root.getValue()); 
    if(root.rightLink != null) 
    { 
     root = root.rightLink; 
     traverseShow(); 
    } 
    return; 
} 

static void addNode(node n) 
{ 
    if(root==null) 
    { 
     root = n; 
    } 
    else 
    { 
     if(root.getValue()>n.getValue()) 
     { 
      root = root.leftLink; 
      addNode(n); 
     } 
     if(root.getValue()<n.getValue()) 
     { 
      root = root.rightLink; 
      addNode(n); 
     } 
    } 
    return; 
} 

public static void main(String[] args) 
{ 
    int val = 0; 
    Scanner sc = new Scanner(System.in); 
    boolean loop = true; 
    String command = ""; 

    while(loop==true) 
    { 
     System.out.println("Please enter a command:"); 
     System.out.println("A = insert a new value"); 
     System.out.println("B = display all values"); 
     System.out.println("C = exit program"); 
     command = sc.next(); 
     if(command.equalsIgnoreCase("a")) 
     { 
      System.out.println("Enter value: "); 
      val = sc.nextInt(); 
      node newNode = new node(val); 
      addNode(newNode); 
     } 
     else if(command.equalsIgnoreCase("b")) 
     { 
      traverseShow(); 
     } 
     else if(command.equalsIgnoreCase("c")) 
     { 
      sc.close(); 
      System.exit(0); 
     } 
     else 
     { 
      System.out.println("Invalid command! Please try again."); 
     } 
    } 
} 
} 

ответ

2

Вы установка корень на новый узел, когда вы обходе дерева, чтобы найти, где поместить новый узел. Один простой вариант - сохранить текущий корень во временной переменной и вернуть его после вставки узла.

static void addNode(node n) 
{ 
    if(root==null) 
    { 
     root = n; 
    } 
    else 
    { 
     node tmp = root; // save the current root 
     if(root.getValue()>n.getValue()) 
     { 
      root = root.leftLink; 
      addNode(n); 
     } 
     else if(root.getValue()<n.getValue()) 
     { 
      root = root.rightLink; 
      addNode(n); 
     } 
     root = tmp; // put the root back to its original value 
    } 
    return; 
} 

Вы должны сделать что-то подобное для своего метода traverseShow.

+0

Я вижу, поэтому моя программа каждый раз устанавливает новый корень. Я обязательно применим предложенные вами изменения. Спасибо за помощь! – user2604960

Смежные вопросы