在java中构建未排序的二叉树的最有效方法是什么?

时间:2015-05-10 01:04:55

标签: java tree binary-tree

我需要创建一个未排序的二叉树(一个要求是未排序的),它将String作为其值。我的班级大纲看起来像这样:

public class Node {

 private String desc;
 private Node leftNode = null;
 private Node rightNode = null;

 public Node(String desc) {
  this.desc = desc;
 }

 public String getDesc() {
  return desc;
 }

 public Node getLeftNode() {
  return leftNode;
 }

 public Node getRightNode() {
  return rightNode;
 }
}

最终,我希望能够将具有String描述的任何节点替换为具有新描述的新节点(包括带有旧描述的重复节点)。

所以我的问题是,在创建未排序的二叉树时,处理Node的插入的最佳方法是什么?

我想到了两种方法。第一种方法是只有两个方法,setLeftNode(Node root, String desc)setRightNode(Node root, String desc),有人可以使用他们选择的Node作为根。如果已经有左/右Node,那么它只会前进直到它遇到没有左Node的节点。但这可能通过产生超大的高度来引入问题。

我想到的第二种方法是拥有专用的根Node,在这种情况下创建第一个Node,然后按顺序构建新的Node。< / p>

那么创建未排序的二叉树的最佳方法是什么?

5 个答案:

答案 0 :(得分:2)

public class BinaryTree{
    private BinaryTree right;
    private BinaryTree left;
    private String data;        

    public BinaryTree(String s){
        data = s;
        right = null;
        left = null;           
    }

    public void setLeft (BinaryTree l){ left  = l; }
    public void setRight(BinaryTree r){ right = r; }        
}

你的问题表明树应该是平衡的,所以插入一个元素时,你应该递归地检查树每一侧的节点数:

public int checkTree(){
    if(left == null && right == null){
        return 1;
    }else if(left == null){
        return 1 + right.checkTree();
    }else if(right == null){
        return 1 + left.checkTree();
    }else{
        return 1 + left.checkTree() + right.checkTree();
    }
}

public void insert(BinaryTree bt){
    if(left == null){
        setLeft(bt);
    }else if(right == null){
        setRight(bt);
    }else{
        if(left.checkTree() <= right.checkTree()){
            left.insert(bt);
        }else{
            right.insert(bt);
        }
    }
}






编辑:

public class BinaryTree {
    private BinaryTree right;
    private BinaryTree left;
    private String data;
    private int weight;

    public BinaryTree(String s){
        data = s;
        right = null;
        left = null; 
        weight = 1;
    }    

    public void setLeft (BinaryTree l){ 
        left  = l;
        weight++;
    }

    public void setRight(BinaryTree r){
        right = r;
        weight++;
    } 

    public int getWeight(){ return weight; }

    public void insert(BinaryTree bt){
        if(left == null){
            setLeft(bt);
        }else if(right == null){
            setRight(bt);
        }else{
            if(left.getWeight() <= right.getWeight()){
                left.insert(bt);
                weight++;
            }else{
                right.insert(bt);
                weight++;
            }
        }
    }    
}    

答案 1 :(得分:1)

根据定义,二叉树的左边是最低的元素,右边是最高的元素。但是如果你真的希望所有搞砸了(排序)你可以调用一个导致0或1的rand函数,如果是0然后向左移动,如果1向右移动,则随机。这将导致未排序的树

答案 2 :(得分:1)

  

最终我希望能够替换任何与String匹配的节点   描述与具有新描述的新节点(包括   与旧描述重复。)

为此,您必须搜索整个树:

private Node searchBasedOnValue(String desc, Node currentNode)
{  
    Node result = null
    if (currentNode == null)
        return null;
    if (currentNode.getDesc().equals(desc)) 
        return currentNode ;
    if (currentNode.getLeftNode() != null)
        result = searchBasedOnValue(desc,currentNode.getLeftNode());
    if (result == null)
        result = searchBasedOnValue(desc,currentNode.getRightNode());
    return result;
}

IMO,常规Binary Tree永远不会被排序,排序的名称为Binary Search Tree。对于插入,您需要按照您想要的方式处理。可能是您可以在树的左右子项中插入节点,以便在某种程度上平衡它。这取决于你如何照顾它。

我没有看到常规Binary Tree的实际用法,因为大多数时候我们使用Binary Search Tree在插入,删除和查找方面具有更好的性能(lg(n))。< / p>

答案 3 :(得分:0)

如果它没有排序,为什么要构建二叉树呢?你无法在不进行全面扫描的情况下进行搜索,所以你也可以把所有内容放在一个数组中,因为访问任何元素都是O(n),因为无法搜索。

答案 4 :(得分:0)

这是构建未排序二叉树的最快方法,其形状没有任何限制:

首先你需要一个像这样的构造函数:

   public Node(String desc, Node left, Node right) {
       this.desc = desc;
       this.left = left;
       this.right = right;
   }

然后像这样构建树:

   Node root = null;
   for (String input: ...) {
      root = new Node(input, root, null);
   }

显然,这会给你一个不平衡的,未排序的树,搜索需要查看所有节点。但是,如果树未分类,那么树不平衡的事实没有区别

通常,搜索未排序的树与搜索列表具有相同的复杂性,并且代码更复杂。