Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.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_Data Structures - Fatal编程技术网

在java中,我应该如何通过将深度作为输入来创建二叉树?

在java中,我应该如何通过将深度作为输入来创建二叉树?,java,data-structures,Java,Data Structures,在我的例子中,我想通过将深度作为输入来创建一个二叉树 例如,如果我执行tree.create(3),当最左边的深度为3时,将生成一个二叉树,这意味着树中将有2^3-1个节点,所有节点的值都将为0。该指数将为0-6 class Tree<T> { int depth; int index; T value; public Tree(int index,T value) { this.index = index; thi

在我的例子中,我想通过将深度作为输入来创建一个二叉树

例如,如果我执行tree.create(3),当最左边的深度为3时,将生成一个二叉树,这意味着树中将有2^3-1个节点,所有节点的值都将为0。该指数将为0-6

class Tree<T> {

    int depth;
    int index;
    T value;

    public Tree(int index,T value) {
        this.index = index;
        this.value = value;
    }

    public static <K> Tree<K> create(int depth){
        if(depth >= 1) {

            //return a tree with the inputting depth, 
            //but I don't know how to do in this step

            return new Tree(...?)
        }
    } 
}
类树{
智力深度;
整数指数;
T值;
公共树(int索引,T值){
这个指数=指数;
这个值=值;
}
公共静态树创建(int-depth){
如果(深度>=1){
//返回具有输入深度的树,
//但我不知道这一步该怎么做
返回新树(…?)
}
} 
}

我应该使用哪部分知识来用Java实现这一点?谢谢

使用二叉树数据结构时,通常需要编写递归方法。编写递归方法时,需要编写终止递归的条件。在您的例子中,如果达到了所需的深度,递归将结束。为了确定我们是否达到了预期深度,我们需要知道预期深度和当前深度。我将假设二叉树中根节点的深度为零。这意味着最大深度为3级(如您问题中的示例所示),最深的级别将为2级。如果我们还没有达到所需的深度,那么我需要添加一个左和右子节点,然后对每个子节点调用相同的方法,并确保子节点的深度比父节点的深度大一个。因此,我的递归方法需要三个参数:

  • 要(可能)将子节点添加到的节点
  • 当前深度
  • 最大深度
注意,我不需要处理每个节点包含的值(或数据),因为您在问题中声明每个节点将具有相同的值。因此,我可以简单地将值从父节点复制到它的每个子节点

这是一个完整的例子。请注意,当我测试它时,深度大于25会导致
OutOfMemoryError
,因为递归方法调用的次数是有限的

import java.util.ArrayList;
导入java.util.List;
公共类二叉树{
二萜根;
公共静态二叉树创建(int-depth,T-val){
如果(深度>0){
BinTree theTree=新的BinTree();
tree.root=新的BinTreeNode(val);
tree.addLevel(tree.root,0,深度);
返回树;
}
否则{
抛出新的IllegalArgumentException(“无效深度:+depth”);
}
}
公共真空组件(BinTreeNode阳极,列表){
如果(阳极==null){
返回;
}
否则{
获取等位元素(阳极、左侧、列表);
列表.添加(阳极.一般对象);
获取等位元素(阳极、右侧、列表);
}
}
私有void addLevel(BinTreeNode theNode,int-level,int-deep){
如果(级别==最深-1){
返回;
}
theNode.left=新的BinTreeNode(theNode.generiobject);
theNode.right=新的BinTreeNode(theNode.generiobject);
添加级别(节点左侧,级别+1,最深);
添加级别(节点右侧,级别+1,最深);
}
公共静态void main(字符串[]args){
BinTree aTree=BinTree.create(3,“George”);//最大深度=25
列表=新的ArrayList();
aTree.getAllegements(aTree.root,list);
System.out.println(list.size());
}
}
二萜类{
左、右二叉树烯醇;
T一般对象;
公共二叉树节点(T obj){
genericObject=obj;
}
}
注意,我添加了方法
getAllegements
,以测试是否创建了正确数量的节点