1. 程式人生 > >非遞迴求取二叉樹的最大/小深度

非遞迴求取二叉樹的最大/小深度

分層遍歷的思路
二叉樹分層遍歷用到的是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; //返回最大深度
}