【问题标题】:java binary tree insert function non recursivejava二叉树插入函数非递归
【发布时间】:2012-10-07 09:18:22
【问题描述】:

我编写了一个代码,用于向二叉树插入按名称排序的元素泛型类型。但不要认为它是正确的。

public boolean insert(E e) {
    BTNode temp = root;
    if (root == null) {
        root.setElement(e);
    }
    while (temp != null)
    if (temp.element().getClass().getName().compareTo(e.getClass().getName()) < 0) {
        temp = temp.getRight();
    } else {
        temp = temp.getLeft();
    }
    temp.setElement(e);
    return true;
}

你能建议我更正吗?

【问题讨论】:

  • 去掉while语句后面的分号。
  • temp -- 变量名的绝佳选择。
  • @amadeus 很好的尝试,但temp.setElement(e); 始终是 NPE。

标签: java tree non-recursive


【解决方案1】:

插入需要创建一个新节点。我现在不知道如何创建它们,因为我没有看到构造函数,但我建议如下:

public boolean insert(E e) {        
    if (root == null) {
        root = new BTNode();
        root.setElement(e); //how would this work with a null root?
        return true; //that's it, we're done (when is this ever false by the way?)
    }
    BTNode current = root; 
    while (true) { //brackets! indenting is important for readabilty
        BTNode parent=current;
        if (current.element().getClass().getName().compareTo(e.getClass().getName()) < 0) {
            current = current.getRight();
            if(current==null) { //we don't have a right node, need to make one
              current = new BTNode();
              parent.setRight(current);
              break; //we have a new node in "current" that is empty
            }
        } else { 
            current= current.getLeft();
            if(current==null) { //we don't have a left node, need to make one
              current = new BTNode();
              parent.setLeft(current);
              break;  //we have a new node in "current" that is empty
            }
        }
    }
    current.setElement(e); 
    return true; 
} 

【讨论】:

    【解决方案2】:
    public Boolean add(int data){
        Node node = new Node(data);
        if(isEmpty()){
            root = node;
        }else{
            Node temp = root;
            while(true){
                if(data < temp.getData()){
                    if(temp.getLeft() != null)
                        temp = temp.getLeft();
                    else
                        break;
                }else{
                    if(temp.getRight() != null)
                        temp = temp.getRight();
                    else
                        break;
                }
            }
            if(data < temp.getData())
                temp.setLeft(node);
            else
                temp.setRight(node);
        }
        return true;
    }
    

    【讨论】:

      【解决方案3】:

      正如 amadeus 所说,while 循环的末尾不应有分号:

      BTNode temp = root;
          if (root == null) {
              root.setElement(e);
              return;
          }
          while (temp != null)
           {
             if (temp.element().getClass().getName().compareTo(e.getClass().getName()) < 0) {
                 if(temp.getRight() != null)
                   temp = temp.getRight();
                 else
                   {
                     temp.createRight(e);
                     temp = null; //or break
                   }
             } else {
                 if(temp.getLeft() != null)
                   temp = temp.getLeft();
                 else
                   {
                     temp.createLeft(e);
                     temp = null; //or break
                   }
             }
           }
      
          return true;
      

      【讨论】:

      • -1 和我提到的: 然后是 temp.setElement(e);始终是空指针异常。
      • 另一种解决方案是捕获异常并在“catch”块中处理节点的创建......虽然很丑......
      • 猜我错过了删除最后一条语句...。该元素在 while 循环本身的前面设置...
      • 你是对的@eston temp 总是指向空指针异常.. 那么如何更正代码以在正确的位置插入下一个元素?
      猜你喜欢
      • 2021-09-01
      • 2012-11-16
      • 2020-07-24
      • 2014-12-03
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多