2013-07-07 299 views
4

当我将节点添加到二叉树并试图显示有关它的信息时,不显示信息。我认为我在递归插入算法中引用了一些问题,但无法修复它。递归二叉树插入

package test; 

class BinaryTree<T> { 
    private static class Node<T> { 
     int key; 
     T data; 
     Node<T> leftChild; 
     Node<T> rightChild; 

     public Node(int key,T data) { 
      this.key = key; 
      this.data = data; 
     } 
    } 

    public Node<T> rootNode; 

    public BinaryTree() { 
     rootNode = null; 
    } 

    public Node<T> getRootNode() { 
     return rootNode; 
    } 

    // insert node into binary tree 
    public void insertNode(int key,T data, Node<T> rootNode) { 
     // to create new node 

     // if tree doesn't have root elements 
     if(rootNode == null) { 
      rootNode = new Node<T>(key,data); 
      rootNode.leftChild = null; 
      rootNode.rightChild = null; 
     } 
     else { 
      Node<T> focusNode = rootNode; 

      if(key >= focusNode.key) { 
       insertNode(key,data,focusNode.rightChild); 
      } 
      else { 
       insertNode(key,data,focusNode.leftChild); 
      } 
     } 
    } 

    // inorder traverse tree 
    public void inOrderTraverseTree(Node<T> focusNode) { 
     if(focusNode != null) { 
      inOrderTraverseTree(focusNode.leftChild); 
      System.out.println(focusNode.data); 
      inOrderTraverseTree(focusNode.rightChild); 
     } 
    } 
} 

public class MyApp { 
    public static void main(String[] args) { 
     BinaryTree<String> bintree = new BinaryTree<String>(); 
     bintree.insertNode(3, "Boss", bintree.rootNode); 
     bintree.inOrderTraverseTree(bintree.rootNode); 
    } 
} 

如果我用这个算法添加节点并尝试显示信息,它就可以工作。我如何解决递归算法的问题?

public void addNode(int key, T name) { 
     Node<T> newNode = new Node<T>(key,name); 
     if(rootNode == null) { 
      rootNode = newNode; 
     } 
     else { 
      Node<T> focusNode = rootNode; 
      Node<T> parent; 
      while(true) { 
       parent = focusNode; 
       if(key < focusNode.key) { 
        focusNode = focusNode.leftChild; 
        if(focusNode == null) { 
         parent.leftChild = newNode; 
         return; 
        } 
       } 
       else { 
        focusNode = focusNode.rightChild; 
        if(focusNode == null) { 
         parent.rightChild = newNode; 
         return; 
        } 
       } 
      } 
     } 
    } 

感谢您的帮助。

回答

3

您的代码快速一瞥 - 我发现在这部分,你要检查空,根节点变量是函数的局部。因此,您所创建的新节点逃脱立即退出函数抛出后,它不会改变你的成员字段

// if tree doesn't have root elements 
    if(rootNode == null) { 
     rootNode = new Node<T>(key,data); 
     rootNode.leftChild = null; 
     rootNode.rightChild = null; 
    } 

您需要使用this.rootNode = new Node<T>(key,data);替代,或者用不同的局部变量的名称,以避免混淆

+0

+1为伟大的bug视觉。提问:多么糟糕的名字选择! –

+0

@gerrytan感谢您的帮助。) – veinhorn