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

xxls0lw8  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(270)

在我的例子中,我想通过将深度作为输入来创建一个二叉树。
例如,如果我做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(...?)
        }
    } 
}

我应该用哪一部分的知识来用java实现这一点?谢谢!

3pmvbmvn

3pmvbmvn1#

通常在使用二叉树数据结构时,需要编写递归方法。在编写递归方法时,需要编写终止递归的条件。在您的例子中,如果我们已经达到所需的深度,递归将结束。为了确定我们是否达到了期望的深度,我们需要知道期望的深度和当前的深度。我将假设二叉树中根节点的深度为零。这意味着对于最大深度3(如您问题中的示例),最深的级别将是级别2。如果我们还没有达到所需的深度,那么我需要添加一个左和右子节点,然后对每个子节点调用相同的方法,并确保子节点的深度比父节点的深度大一个。所以我的递归方法需要三个参数:
要(可能)将子节点添加到的节点
当前深度
最大深度
注意,我不需要处理每个节点包含的值(或数据),因为在您的问题中,您声明每个节点将具有相同的值。因此,我可以简单地将值从父节点复制到它的每个子节点。
下面是一个完整的例子。注意,当我测试它时,深度大于25会导致 OutOfMemoryError 因为递归方法调用的次数是有限制的。

import java.util.ArrayList;
import java.util.List;

public class BinTree<T> {
    BinTreeNode<T>  root;

    public static <T> BinTree<T> create(int depth, T val) {
        if (depth > 0) {
            BinTree<T> theTree = new BinTree<>();
            theTree.root = new BinTreeNode<>(val);
            theTree.addLevel(theTree.root, 0, depth);
            return theTree;
        }
        else {
            throw new IllegalArgumentException("Invalid depth: " + depth);
        }
    }

    public void getAllElements(BinTreeNode<T> aNode, List<T> list) {
        if (aNode == null) {
            return;
        }
        else {
            getAllElements(aNode.left, list);
            list.add(aNode.genericObject);
            getAllElements(aNode.right, list);
        }
    }

    private void addLevel(BinTreeNode<T> theNode, int level, int deepest) {
        if (level == deepest - 1) {
            return;
        }
        theNode.left = new BinTreeNode<>(theNode.genericObject);
        theNode.right = new BinTreeNode<>(theNode.genericObject);
        addLevel(theNode.left, level + 1, deepest);
        addLevel(theNode.right, level + 1, deepest);
    }

    public static void main(String[] args) {
        BinTree<String> aTree = BinTree.create(3, "George"); // max depth = 25
        List<String> list = new ArrayList<>();
        aTree.getAllElements(aTree.root, list);
        System.out.println(list.size());
    }
}

class BinTreeNode<T> {
    BinTreeNode<T> left, right;
    T genericObject;

    public BinTreeNode(T obj) {
        genericObject = obj;
    }
}

注意,我添加了 getAllElements 作为测试,以查看是否创建了正确数量的节点。

相关问题