Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.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中无setter的平衡二叉树_Java_Tree_Binary Tree_Setter - Fatal编程技术网

Java中无setter的平衡二叉树

Java中无setter的平衡二叉树,java,tree,binary-tree,setter,Java,Tree,Binary Tree,Setter,我正在做一个关于创建平衡二叉树的学校作业。节点和树的接口随声明的方法一起提供。但是,节点接口只有getLeft、getRight和getValue方法,没有设置器。因为我们只提交实现文件进行分级,所以我通过使用实现类本身而不是接口进行键入来解决这个问题 当我给老师发信息时,他告诉我,可以仅使用节点构造函数来实现它,并添加了一个“提示”,即“对于每个节点,其子节点也是树”。这是显而易见的,但我不确定这对我有何帮助 在我看来,如果不使用setter,我首先需要基本上提前绘制出树,然后从底部开始构建树

我正在做一个关于创建平衡二叉树的学校作业。节点和树的接口随声明的方法一起提供。但是,节点接口只有
getLeft
getRight
getValue
方法,没有设置器。因为我们只提交实现文件进行分级,所以我通过使用实现类本身而不是接口进行键入来解决这个问题

当我给老师发信息时,他告诉我,可以仅使用节点构造函数来实现它,并添加了一个“提示”,即“对于每个节点,其子节点也是树”。这是显而易见的,但我不确定这对我有何帮助

在我看来,如果不使用setter,我首先需要基本上提前绘制出树,然后从底部开始构建树,而不是从顶部,这似乎是不必要的复杂和违反直觉的。我错过了什么把戏吗

感谢您提供的任何帮助或建议

我当前的实现如下所示:

TreeImpl.java

public class TreeImpl implements Tree {
    private NodeImpl root;

    public TreeImpl() {}

    @Override
    public void setTree(int[] values) {
        this.root = null;
        Arrays.sort(values);
        recurseSet(values);
    }

    private void recurseSet(int[] values) {
        if (values.length > 0) {
            int middleIndex = values.length / 2;
            NodeImpl tempNode = new NodeImpl(values[middleIndex]);
            insert(tempNode, root, 1);
            recurseSet(cutArray(values, 0, middleIndex - 1));
            recurseSet(cutArray(values, middleIndex+1, values.length-1));
        }
    }

    private int[] cutArray(int[] array, int begin, int end) {
        int length = end-begin+1;
        int[] newArray = new int[length];
        System.arraycopy(array, begin, newArray, 0, length);
        return newArray;
    }


    private void insert(NodeImpl node, NodeImpl location, int depth) {
        if (root == null) {
            root = node;
            return;
        }
        if (node.getValue() < location.getValue()) {
            /* left branch */
            if(location.getLeft() == null) {
                node.setDepth(depth);
                location.setLeft(node);
            } else {
                insert(node, location.getLeft(), depth+1);
            }

        } else {
            /* right branch */
            if(location.getRight() == null) {
                node.setDepth(depth);
                location.setRight(node);
            } else {
                insert(node, location.getRight(), depth+1);
            }
        }

    }

    @Override
    public Node getRoot() {
        return root;
    }

    private String toString(NodeImpl root) {
        String finalString = "";
        if (root != null) {
            finalString += root;
            finalString += toString(root.getLeft());
            finalString += toString(root.getRight());
        }
        return finalString;
    }

    @Override
    public String toString() {
        return toString(root);
    }
}
public class NodeImpl implements Node {
    private int value;
    private NodeImpl left;
    private NodeImpl right;
    private int depth = 0;

    public NodeImpl(int value) {
        this.value = value;
    }

    public void setLeft(NodeImpl left) {
        this.left = left;
    }

    public void setRight(NodeImpl right) {
        this.right = right;
    }

    public void setDepth(int depth) {
        this.depth = depth;
    }

    @Override
    public NodeImpl getLeft() {
            return left;
    }

    @Override
    public NodeImpl getRight() {
        return right;
    }

    @Override
    public int getValue() {
        try {
            return value;
        } catch (NullPointerException e) {
            System.out.println("Null pointer.");
        }
        return 0;
    }

    @Override
    public String toString() {
        String finalString = "";
        for(int i = 0; i < depth; i++) {
            finalString += " ";
        }
        finalString += "- ";
        finalString += value;
        finalString += "\n";
        return finalString;
    }

}
公共类TreeImpl实现树{
私有NodeImpl根;
public TreeImpl(){}
@凌驾
公共void集合树(int[]值){
this.root=null;
数组。排序(值);
递归集(值);
}
私有void递归集(int[]值){
如果(value.length>0){
int middleIndex=value.length/2;
NodeImpl tempNode=新的NodeImpl(值[middleIndex]);
插入(tempNode,root,1);
递归集(cutArray(值,0,索引-1));
recurseSet(cutArray(value,middleIndex+1,value.length-1));
}
}
私有int[]数组(int[]数组,int开始,int结束){
整数长度=结束-开始+1;
int[]newArray=newint[length];
System.arraycopy(数组,开始,新建数组,0,长度);
返回新数组;
}
私有void插入(NodeImpl节点、NodeImpl位置、int深度){
if(root==null){
根=节点;
返回;
}
if(node.getValue()
NodeImpl.java

public class TreeImpl implements Tree {
    private NodeImpl root;

    public TreeImpl() {}

    @Override
    public void setTree(int[] values) {
        this.root = null;
        Arrays.sort(values);
        recurseSet(values);
    }

    private void recurseSet(int[] values) {
        if (values.length > 0) {
            int middleIndex = values.length / 2;
            NodeImpl tempNode = new NodeImpl(values[middleIndex]);
            insert(tempNode, root, 1);
            recurseSet(cutArray(values, 0, middleIndex - 1));
            recurseSet(cutArray(values, middleIndex+1, values.length-1));
        }
    }

    private int[] cutArray(int[] array, int begin, int end) {
        int length = end-begin+1;
        int[] newArray = new int[length];
        System.arraycopy(array, begin, newArray, 0, length);
        return newArray;
    }


    private void insert(NodeImpl node, NodeImpl location, int depth) {
        if (root == null) {
            root = node;
            return;
        }
        if (node.getValue() < location.getValue()) {
            /* left branch */
            if(location.getLeft() == null) {
                node.setDepth(depth);
                location.setLeft(node);
            } else {
                insert(node, location.getLeft(), depth+1);
            }

        } else {
            /* right branch */
            if(location.getRight() == null) {
                node.setDepth(depth);
                location.setRight(node);
            } else {
                insert(node, location.getRight(), depth+1);
            }
        }

    }

    @Override
    public Node getRoot() {
        return root;
    }

    private String toString(NodeImpl root) {
        String finalString = "";
        if (root != null) {
            finalString += root;
            finalString += toString(root.getLeft());
            finalString += toString(root.getRight());
        }
        return finalString;
    }

    @Override
    public String toString() {
        return toString(root);
    }
}
public class NodeImpl implements Node {
    private int value;
    private NodeImpl left;
    private NodeImpl right;
    private int depth = 0;

    public NodeImpl(int value) {
        this.value = value;
    }

    public void setLeft(NodeImpl left) {
        this.left = left;
    }

    public void setRight(NodeImpl right) {
        this.right = right;
    }

    public void setDepth(int depth) {
        this.depth = depth;
    }

    @Override
    public NodeImpl getLeft() {
            return left;
    }

    @Override
    public NodeImpl getRight() {
        return right;
    }

    @Override
    public int getValue() {
        try {
            return value;
        } catch (NullPointerException e) {
            System.out.println("Null pointer.");
        }
        return 0;
    }

    @Override
    public String toString() {
        String finalString = "";
        for(int i = 0; i < depth; i++) {
            finalString += " ";
        }
        finalString += "- ";
        finalString += value;
        finalString += "\n";
        return finalString;
    }

}
公共类NodeImpl实现节点{
私有int值;
私有节点左;
私权;
私有整数深度=0;
公共NodeImpl(int值){
这个值=值;
}
公共void setLeft(NodeImpl left){
this.left=左;
}
公共无效设置权限(NodeImpl权限){
这个。右=右;
}
公共void setDepth(int-depth){
这个。深度=深度;
}
@凌驾
公共NodeImpl getLeft(){
左转;
}
@凌驾
公共NodeImpl getRight(){
返还权;
}
@凌驾
public int getValue(){
试一试{
返回值;
}捕获(NullPointerException e){
System.out.println(“空指针”);
}
返回0;
}
@凌驾
公共字符串toString(){
字符串finalString=“”;
for(int i=0;i
我对您的代码进行了一些处理,我想我已经找到了解决方法:

class NodeImpl implements Node {
    private int value;
    private Node left;
    private Node right;

    public NodeImpl(int value, Node left, Node right) {
        this.value = value;
        this.left = left;
        this.right = right;
    }

    public Node getLeft() {
        return left;
    }

    public Node getRight() {
        return right;
    }

    public int getValue() {
        return value;
    }

    @Override
    public String toString() {
        // here you have to put some nice drawing logic.
        return  (left != null ? left.toString() : "") + "<-" + value + "->" + (right != null ? right.toString() : "");
    }
}

class TreeImpl implements Tree {
    private Node root;

    public void setTree(int[] values) {
        Arrays.sort(values);
        this.root = recurseSet(values);
    }

    private Node recurseSet(int[] values) {
        if (values.length > 0) {
            int middleIndex = values.length / 2;
            return new NodeImpl(
                values[middleIndex], recurseSet(cutArray(values, 0, middleIndex - 1)),
                recurseSet(cutArray(values, middleIndex + 1, values.length - 1))
            );
        } else {
            return null;
        }
    }

    private int[] cutArray(int[] array, int begin, int end) {
        int length = end - begin + 1;
        int[] newArray = new int[length];
        System.arraycopy(array, begin, newArray, 0, length);
        return newArray;
    }

    public Node getRoot() {
        return root;
    }
}

您只需考虑如何实现
NodeImpl.toString()
方法以一种良好的方式绘制每个节点:)我希望它能帮助您。

谢谢。您的实现看起来正是我所认为的,通过使用递归函数来代替左、右子代,我只是不确定该如何实现。非常感谢。