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

C++ 如何在不使用递归的情况下获得二叉树的最小高度?,c++,binary-tree,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(); qu

我已经在这上面呆了一段时间了。这是我到目前为止得到的结果,但它给出了错误的结果

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;
}
int get\u min\u height\u iter(节点*r){
如果(!r)返回0;
std::队列;
排队推送(r);
整数计数=1;
而(!queue.empty()){
Node*temp=queue.front();
queue.pop();
如果(!temp->left | |!temp->right)
返回计数;
++计数;
队列推送(临时->左);
队列推送(临时->右侧);
}
返回-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();
}
intmain(){
节点*根=新节点(1);
根->左=新节点(2);
根->右=新节点(3);
根->左->右=新节点(4);
根->左->右->左=新节点(5);
根->右->右=新节点(6);

您可能有三到四个问题:

  • 您需要将每个节点的秩(深度)以及节点本身推送到队列中。如果在其他地方没有位置,您可以使用
    std::pair
    捆绑这些信息。如果节点结构有“depth”或“rank”成员,您只需更新即可
  • 问题陈述要求您测量深度,而不是计算节点数。给定节点的深度等于其父节点的深度加上1。您的循环当前计算节点数
  • 仅推送队列中的子项(如果存在)
  • 如果将最小深度指定为到没有子节点的节点的最短路径,则“If()return”条件应查找left和right为null,而不是left或right为null

  • 您只将节点信息推送到堆栈中。但您还需要将当前值
    count
    与节点信息一起包含。否则,当您弹出节点时,您不知道该节点添加到堆栈时的深度。
    root(1)->left(2)->left(空)
    的高度为2。但是,正如@jogojapan所提到的,该算法在其他情况下无法正常工作,因为您没有记录足够的信息。