java - 递归创建完整且完整的二叉树
问题描述
目的:
我想创建一个完整且完整的二叉树,它递归地在其叶子中保存一个字符串值。
示例 1: 假设您想在树中保存两个字符串。所以你需要一个根和两片叶子。
* <- root node
/ \
v0 v1 <- leaves
示例 2: 假设您想在树中保存三个字符串。所以你需要一个根,两个内部节点但四个叶子,所以树仍然是完整的。
* <- root node
/ \
+ + <- inner node
/ \
/ \
/ \ / \
v0 v1 v2 v3 <- leaves
数学诡计:
计算二叉树的规格相当简单。
高度: ⌈log2 expectedNumOfStrings⌉</p>
double height = Math.log(expectedNumOfStrings) / Math.log(2);
int roundedHeight = (int) Math.ceil(height);
叶数: 2高度
int numOfLeaves = (int) Math.pow(2, roundedHeight);
内部节点数: 2 h - 1
int numOfInnerNodes = (int) (Math.pow(2, roundedHeight)-1)
执行:
让我们为这个二叉树实现几个类。我们需要一 BinaryTree
堂课。
/**
* Create a complete binary tree recursively depending on the expected leaves.
*/
public class BinaryTree {
private InnerNode root;
private LeafNode current;
public BinaryTree(int expectedNumOfStrings) {
//sets root node
this.root = new InnerNode();
//set inner nodes
root.createInnerNodes(expectedNumOfStrings);
//set leaves
root.createLeaves(expectedNumOfStrings);
//The way things are now the tree isn't created in one go.
//I'll have to traverse it again for the leaves.
}
}
树的所有元素共享一个到父节点的链接(对于根它是null
)。让我们创建一个类TreeNode
:
public class TreeNode {
private TreeNode parent;
}
现在让我们创建它InnerNode
,LeafNode
它只是扩展了 TreeNode。
public class InnerNode extends TreeNode {
private BinaryTree left;
private BinaryTree right;
//used to set the root node
public InnerNode() {
super.parent = null;
this.left=null;
this.right=null;
}
public InnerNode(InnerNode parent) {
super.parent= parent;
}
public TreeNode createInnerNodes(int expectedValues) {
//recursive magic happens here. But how?
}
}
和
public class LeafNode extends TreeNode {
private String data;
public LeafNode(InnerNode parent) {
super.parent= parent;
}
public LeafNode createLeaves(int numOfLeaves) {
//recursive magic happens here again. But how?
}
}
问题和问题
- 我想保持班级分开,并且我想一次性设置树。我如何设置
InnerNodes
并Leaves
在“同一”时间? InnerNode left
并且InnerNode right
是私有的,所以我只能从内部访问它们InnerNode
。但是那我该如何处理叶子呢?我可以在方法中将根节点传递给InnerNode
/Leaves
吗?- 什么最适合递归?对应节点的高度或数量?还是完全不同的东西?
- 如何设置左右指针?我的意思是他们指向的对象还不存在,是吗?
- 我在正确的轨道上吗?/o\
解决方案
推荐阅读
- unit-testing - 在 InMemoryDatabase 中模拟 EF 核心计算字段以进行单元测试
- sql - 如何使用选择一列从一个配置单元表插入到另一个配置单元表
- ruby-on-rails - 这个 Rails has_many through: 结构有什么问题?
- c# - C# 正则表达式匹配动态 Html 文档中的文件名
- mqtt - 为什么第二个 MQTT 连接会导致 MQTT 断开连接?
- java - 如何根据Java中的日期约束从Oracle表中删除记录?
- kotlin - kotlin 中的多种具体参数类型
- python - 如何调整我的代码(python)以在谷歌表格上创建一个新标签,而不是只更新一个标签?
- firebase - 动态路由 nextjs 和 firebase
- swift - 缩放适合和调整大小不起作用 Lottie 到 Xcode SwiftUI