使用递归检查树是否平衡

时间:2012-10-19 05:00:07

标签: c++ tree

实施:

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,空树的高度为零。因此,空树很容易被认为是完全平衡的。

当我们向下移动树时,如何处理递增的增长?

1 个答案:

答案 0 :(得分:0)

这取决于您担心的递归增长的哪个方面。如果你担心递归调用的总数,可能值得指出这里的典型实现是O(N)个总调用,其中N是树节点的数量。由于高度的定义是每个节点,很难想象比O(N)更好。

如果你担心最大递归深度,并且可能会搞砸你的调用堆栈:你可以做的一件事就是根本不使用调用堆栈。也就是说,将递归实现为作用于标准堆栈对象之上的循环。在引擎盖下,这将大部分内存使用量移动到堆上(通过动态重新分配底层列表,双端队列等)并防止泛滥您的调用堆栈。 (请注意,对内存使用和堆栈与堆的讨论实际上是依赖于C ++实现的。但是,据我所知,它适用于所有主要的PC环境。)