如何在不使用递归的情况下获得二叉树的最小高度?

时间:2013-12-18 03:11:47

标签: c++ binary-tree

我已经坚持了一段时间了。这是我到目前为止所做的,但它给出了错误的结果。

int get_min_height_iter(Node* r) {

    if (!r) return 0;

    std::queue<Node*> queue;
    queue.push(r);

    int count = 1;

    while (!queue.empty()) {

        Node* temp = queue.front();
        queue.pop();

        if (!temp->left || !temp->right)
            return count;

        ++count;

        queue.push(temp->left);
        queue.push(temp->right);

    }

    return -1;
}

请注意,我已经可以使用递归来执行此功能,我特别感兴趣的是使用队列或堆栈。我也可以获得树的最大高度;我现在需要创建一个函数来获得最小高度。

例如在这种情况下,函数应返回3,但它返回2:

int main() {

    Node* root = new Node(1);
    root->left = new Node(2);
    root->right = new Node(3);
    root->left->right = new Node(4);
    root->left->right->left = new Node(5);
    root->right->right = new Node(6);

    cout << get_min_height_iter(root);

    cin.get();
}

我知道它为什么这样做,我使用调试器跟踪代码,但我对二叉树没有太多经验,我不知道如何解决它。非常感谢提示!

1 个答案:

答案 0 :(得分:2)

你有三到四个问题:

  1. 您需要将每个节点的等级(深度)与节点本身一起推送到队列中。如果您在其他地方没有这些信息,可以使用std::pair<>捆绑该信息。如果节点结构具有“深度”或“等级”成员,则只需更新该成员。
  2. 您的问题陈述要求您测量深度,而不是计算节点。给定节点的深度等于其父节点的深度加1。您的循环当前计算节点。
  3. 仅在队列中存在子节点(如果存在)。
  4. 如果将min depth指定为没有后代的节点的最短路径,则“if()return”条件应该查找左右为空,而不是正确为空。