实施:
bool tree_isBalanced(tree_t tree);
// EFFECTS: returns true if tree is balanced, false otherwise
考虑到您可以假设为您实现的以下功能:
bool tree_isEmpty(tree_t tree);
// EFFECTS: returns true if tree is empty, false otherwise
tree_t tree_make();
// EFFECTS: creates an empty tree.
tree_t tree_make(int elt, tree_t left, tree_t right);
// EFFECTS: creates a new tree, with elt as it's element, left as
// its left subtree, and right as its right subtree
int tree_elt(tree_t tree);
// REQUIRES: tree is not empty
// EFFECTS: returns the element at the top of tree.
tree_t tree_left(tree_t tree);
// REQUIRES: tree is not empty
// EFFECTS: returns the left subtree of tree
tree_t tree_right(tree_t tree);
// REQUIRES: tree is not empty
// EFFECTS: returns the right subtree of tree
如果树的右子树和左子树与树中的每个节点的高度相同,则树是平衡的。树的高度定义为从树的根到树中最深节点的路径中存在的节点数。只有一个节点的树的高度为1,空树的高度为零。因此,空树很容易被认为是完全平衡的。
当我们向下移动树时,如何处理递增的增长?
答案 0 :(得分:0)
这取决于您担心的递归增长的哪个方面。如果你担心递归调用的总数,可能值得指出这里的典型实现是O(N)个总调用,其中N是树节点的数量。由于高度的定义是每个节点,很难想象比O(N)更好。
如果你担心最大递归深度,并且可能会搞砸你的调用堆栈:你可以做的一件事就是根本不使用调用堆栈。也就是说,将递归实现为作用于标准堆栈对象之上的循环。在引擎盖下,这将大部分内存使用量移动到堆上(通过动态重新分配底层列表,双端队列等)并防止泛滥您的调用堆栈。 (请注意,对内存使用和堆栈与堆的讨论实际上是依赖于C ++实现的。但是,据我所知,它适用于所有主要的PC环境。)