java - 我应该怎么做才能通过将深度作为java中的输入来创建二叉树?
问题描述
就我而言,我想通过将深度作为输入来创建一棵二叉树。
例如,如果我执行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 中实现这一点?谢谢!
解决方案
通常在使用二叉树数据结构时,您需要编写递归方法。编写递归方法时,需要编写终止递归的条件。在您的情况下,如果我们达到所需的深度,递归将结束。为了确定我们是否达到了期望的深度,我们需要知道期望的深度是多少以及当前的深度是多少。我将假设二叉树中根节点的深度为零。这意味着对于 3 的最大深度(如您问题中的示例),最深的级别将是 2 级。如果我们没有达到所需的深度,那么我需要添加一个左右子节点,然后在每个子节点上调用相同的方法,并确保子节点的深度比父节点的深度大一。
- 一个节点(可能)添加子节点
- 当前深度
- 最大深度
请注意,我不需要处理每个节点包含的值(或数据),因为您在问题中声明每个节点都将具有相同的值。因此,我可以简单地将值从父节点复制到它的每个子节点。
这是一个完整的例子。请注意,当我对其进行测试时,大于 25 的深度会导致 an,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
作为测试,以查看是否创建了正确数量的节点。
推荐阅读
- c++ - 我使用了一个向量来创建一个类对象列表。初始化向量时如何使用参数调用构造函数?
- python - 'TypeError: slice indices must be integers or None or have an __index__ method' 整数索引错误
- node.js - 在 Angular 5 http GET 请求中返回部分字符串匹配
- javascript - 同一个 html 页面中的多个模式
- javascript - 如何防止 NetSuite 中显示错误?
- calabash - App Center 测试用例失败,抛出错误“shel”:启动时出错 {“message”=>“在 37282 上等待 Calabash 服务器。未启动。”,
- sequence - 为什么 Perl 6 序列 'A' ... 'AA' 只有一个元素?
- bash - 如何在包含空格并由变量表示的文件中搜索和替换多行文本?
- ruby - 如何在 ruby 中做一个简单的测试
- java - 访问抽象测试类中接口的私有字段