非递归求取二叉树的最大/小深度

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhaopengnju/article/details/52160978
分层遍历的思路
二叉树分层遍历用到的是BFS(广度优先搜索),显然这必须维护一个队列。但是一个队列只能得到遍历结果,并不能一层一层分开,所以必须使用两个队列curr和next,curr保存当前层的所有结点指针,next保存下一层的结点指针,遍历的过程就是出队列的过程,在对curr出队列的同时将推出来的结点的非空左右子结点压入队列next,直到为空那么当前层遍历完毕,同时下一层的所有结点指针也保存完备了。
最大/小深度:

当出队列操作完成,也就是一层遍历完成,这时候可以记录层数,因此可以通过记录切换的次数得到二叉树的深度。

int levelOrder(TreeNode *root) {
        if (root == nullptr) return 0;
        queue<TreeNode*> q1, q2;//用来切换的两个队列
        q1.push(root);
        TreeNode *curr = nullptr;
        int count = 0;
        while (!q1.empty() || !q2.empty()) {
            if (!q1.empty()) ++count;
            while (!q1.empty()) {
                curr = q1.front();//打印
                q1.pop();
                if (curr->left != nullptr) {
                    q2.push(curr->left);
                }
                if (curr->right != nullptr) {
                    q2.push(curr->right);
                }
                /*
                if (curr->left == nullptr && curr->right == nullptr) {//遇到叶子结点就停止遍历,返回层数(最小深度)
                    return count;
                }*/
            }
            if (!q2.empty()) ++count;
            while (!q2.empty()) {
                curr = q2.front();//打印
                q2.pop();
                if (curr->left != nullptr) {
                    q1.push(curr->left);
                }
                if (curr->right != nullptr) {
                    q1.push(curr->right);
                }
               /*
                if (curr->left == nullptr && curr->right == nullptr) { //返回最小深度
                    return count;
                }
                */
            }
        }
        return count; //返回最大深度
}


展开阅读全文

没有更多推荐了,返回首页