非遞迴求取二叉樹的最大/小深度
阿新 • • 發佈:2019-01-02
分層遍歷的思路:
二叉樹分層遍歷用到的是BFS(廣度優先搜尋),顯然這必須維護一個佇列。但是一個佇列只能得到遍歷結果,並不能一層一層分開,所以必須使用兩個佇列curr和next,curr儲存當前層的所有結點指標,next儲存下一層的結點指標,遍歷的過程就是出佇列的過程,在對curr出佇列的同時將推出來的結點的非空左右子結點壓入佇列next,直到為空那麼當前層遍歷完畢,同時下一層的所有結點指標也儲存完備了。
最大/小深度:
二叉樹分層遍歷用到的是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; //返回最大深度 }