【问题标题】:Checking if a tree is balanced using recursion使用递归检查树是否平衡
【发布时间】:2012-10-19 05:00:07
【问题描述】:

实施:

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

当我们向下移动一棵树时,我该如何处理递归增长?

【问题讨论】:

  • 您的问题是担心递归深度,还是不知道如何进行递归?
  • 我发现如果不将其重定向到一个同时返回高度并递归检查余额的函数,递归实现该函数可能会很困难。
  • @Serge 嗯...我在第一次阅读问题时注意到了这一点,然后就忘记了。我想我需要一些早间咖啡(或类似的替代品)。 :)
  • @JoachimPileborg 我知道那种感觉!抱歉……=

标签: c++ tree


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2017-01-09
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 2021-09-24
    • 2022-01-02
    • 1970-01-01
    相关资源
    最近更新 更多