Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
插入方法不适用于二叉树java_Java_Insert_Binary Tree - Fatal编程技术网

插入方法不适用于二叉树java

插入方法不适用于二叉树java,java,insert,binary-tree,Java,Insert,Binary Tree,这不是一个二进制搜索树,只是一个普通的二叉树 以下是我的RegularTree课程: public class RegularTree extends BinaryTree { public RegularTree() { super(); } public void insert(Comparable item) { if(this.isEmpty()) { this.setRoot(new TreeNode(

这不是一个二进制搜索树,只是一个普通的二叉树

以下是我的RegularTree课程:

public class RegularTree extends BinaryTree {

    public RegularTree() {
        super();
    }

    public void insert(Comparable item) {
        if(this.isEmpty()) {
            this.setRoot(new TreeNode(item));
            return;
        }

        TreeNode t = this.getRoot();
        while(t != null) {
            if(t.getLeft() == null)
                t.setLeft(new TreeNode(item));
            else if(t.getRight() == null)
                t.setRight(new TreeNode(item));
            else {
                if(size(t.getLeft()) > size(t.getRight()))
                    t = t.getRight();
                else
                    t = t.getLeft();
            }
        }
    }

    public int size(TreeNode node) {
        return(getSize(node));
    }

    private int getSize(TreeNode node) {
        if (node == null)
            return(0);
        else
            return(getSize(node.getLeft()) + 1 + getSize(node.getRight()));
    }

    public TreeNode find(Comparable key) {
        TreeNode p = this.getRoot();
        while(p != null && key.compareTo(p.getValue()) != 0) {
            if(key.compareTo(p.getValue()) < 0)
                p = p.getLeft();
            else
                p = p.getRight();
        }
        return p;
    }

    public void inorder() {
        doInorderTraversal(this.getRoot());
    }

    private void doInorderTraversal(TreeNode t) {
        if(t != null) {
            doInorderTraversal(t.getLeft());
            System.out.print(t.getValue() + " ");
            doInorderTraversal(t.getRight());
        }
    }

}
这将创建一个如下所示的树:

                1
              /   \
            2       3
           / \     / 
         4    5   6
inoorder应该按顺序遍历树,这意味着它应该打印出4 2 5 1 6 3


然而,当我运行我的主方法时,什么也没有发生。我相信我的insert方法有问题,但我不确定是什么。

正如我在上面的评论中提到的,您应该在调用set{Left,Right}后返回。我刚刚测试了您代码中的修改,得到了您期望的4 2 5 1 6 3

我没有修改代码中的任何其他内容

我将修订版本包括在下面:

public class BinaryTree {

TreeNode root;


public int size(TreeNode node) {
    return(getSize(node));
}

private int getSize(TreeNode node) {
    if (node == null)
        return(0);
    else
        return(getSize(node.getLeft()) + 1 + getSize(node.getRight()));
}

public void insert(Comparable item) {
    if(this.getRoot() == null) {
        this.setRoot(new TreeNode(item));
        return;
    }

    TreeNode t = this.getRoot();
    while(t != null) {
        if(t.getLeft() == null) {
            t.setLeft(new TreeNode(item));
            return;
        }
        else if(t.getRight() == null) {
            t.setRight(new TreeNode(item));
            return;
        }
        else {
            if(size(t.getLeft()) > size(t.getRight()))
                t = t.getRight();
            else
                t = t.getLeft();
        }
    }
}





public TreeNode getRoot() {
    return root;
}

public void setRoot(TreeNode root) {
    this.root = root;
}

public void inorder() {
    doInorderTraversal(this.getRoot());
}

private void doInorderTraversal(TreeNode t) {
    if(t != null) {
        doInorderTraversal(t.getLeft());
        System.out.print(t.getValue() + " ");
        doInorderTraversal(t.getRight());
    }
}

public static void main(String[] args) {
    BinaryTree tree = new BinaryTree();
    tree.setRoot(new TreeNode(1));
    tree.insert(2);
    tree.insert(3);
    tree.insert(4);
    tree.insert(6);
    tree.insert(5);
    tree.inorder();

}
  }

可能还有其他问题,但我认为在insert方法中,您应该在调用t.set{Left,Right}后退出循环,正如您所说,树现在正在插入。然而,我的顺序方法是打印出以下数字:4 2 6 1 5 3出于某种原因,5和6在错误的位置。我认为inorder方法没有问题,因为它对我的BinarySearchTree工作得很好。对不起,那是因为我的插入操作不正确。5应在6之前插入。出于某种原因,它将5和6的位置切换了。你为什么认为这是不正确的?不管顺序如何,仍然会得到一个二叉树。
public class BinaryTree {

TreeNode root;


public int size(TreeNode node) {
    return(getSize(node));
}

private int getSize(TreeNode node) {
    if (node == null)
        return(0);
    else
        return(getSize(node.getLeft()) + 1 + getSize(node.getRight()));
}

public void insert(Comparable item) {
    if(this.getRoot() == null) {
        this.setRoot(new TreeNode(item));
        return;
    }

    TreeNode t = this.getRoot();
    while(t != null) {
        if(t.getLeft() == null) {
            t.setLeft(new TreeNode(item));
            return;
        }
        else if(t.getRight() == null) {
            t.setRight(new TreeNode(item));
            return;
        }
        else {
            if(size(t.getLeft()) > size(t.getRight()))
                t = t.getRight();
            else
                t = t.getLeft();
        }
    }
}





public TreeNode getRoot() {
    return root;
}

public void setRoot(TreeNode root) {
    this.root = root;
}

public void inorder() {
    doInorderTraversal(this.getRoot());
}

private void doInorderTraversal(TreeNode t) {
    if(t != null) {
        doInorderTraversal(t.getLeft());
        System.out.print(t.getValue() + " ");
        doInorderTraversal(t.getRight());
    }
}

public static void main(String[] args) {
    BinaryTree tree = new BinaryTree();
    tree.setRoot(new TreeNode(1));
    tree.insert(2);
    tree.insert(3);
    tree.insert(4);
    tree.insert(6);
    tree.insert(5);
    tree.inorder();

}
  }