二叉树经典题之将二叉树分层打印
生活随笔
收集整理的這篇文章主要介紹了
二叉树经典题之将二叉树分层打印
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
前言:
二叉樹刷題是有固定思維的,請移步
README】二叉樹刷題框架
文章目錄
- 前言:
- 二叉樹的層序遍歷
- 思路一:兩個隊列
- 分析:
- 代碼
- 思路二:變量控制
二叉樹的層序遍歷
題目
點擊跳轉(zhuǎn):LeetCode
思路一:兩個隊列
分析:
如果直接讓你層序遍歷,那么就很簡單,直接使用隊列即可,但是現(xiàn)在它不止要求你層序遍歷打印,而且還要求你同一層的要放在相同的一維vector里(C++中的數(shù)組),最終返回一個二維數(shù)組
思路一就是可以使用兩個隊列,queue_node隊列用來保存二叉樹的結(jié)點,queue_level用于標識某個結(jié)點屬于那一層,因此其類型為int。
整個過程和咋們層序遍歷二叉樹時的那個邏輯基本相似,不過就多了一個隊列。比如下面這顆二叉樹
首先先入根節(jié)點,同時保存層數(shù)的那個隊列就入1,表示根節(jié)點處于第一層
然后出結(jié)點10,同時也出結(jié)點1,將其加入到結(jié)果中。出結(jié)點10的時候,再把9,8入隊列,同時9,8由于是第二層,因為在queue_level中入兩次2。
剩下的過程就是重復。
代碼
雖然思路較為簡單,但是代碼還是有很多值得注意的地方,重點均標記在代碼中
class Solution { public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> ret;if(root==nullptr)//特判,空樹直接返回return ret;vector<int> sub_ret;//二維數(shù)組中的一維數(shù)組queue<TreeNode*> queue_node;//保存結(jié)點的隊列queue<int> queue_level;//保存結(jié)點的層數(shù)的隊列int level=1;//變量level表示層數(shù),默認從第一層開始TreeNode* temp;//中間變量temp,用接收從隊列中彈出的結(jié)點queue_node.push(root);//首先將根節(jié)點加入queue_level.push(level);//根節(jié)點肯定屬于第一層while(!queue_node.empty())//隊列不空,就不斷出隊列{level=queue_level.front();//每結(jié)束第二個while循環(huán),表示一層的已經(jīng)搞完了,使用level更新此時的最新的層數(shù)while(level==queue_level.front())//把位于相同層的結(jié)點全部加入到sub_ret數(shù)組中{temp=queue_node.front();queue_node.pop();if(temp->left!=nullptr)//不要忘記每出一個結(jié)點就要把它的孩子幾點給代入進來,先進左孩子,再進右孩子{queue_node.push(temp->left);queue_level.push(level+1);//進入一個孩子,這個孩子就是下一層了,所以要level+1}if(temp->right!=nullptr){queue_node.push(temp->right);queue_level.push(level+1);}sub_ret.push_back(temp->val);//將同一層的結(jié)點全部加入到sub_ret中queue_level.pop();//queue_level也要記得出隊列}ret.push_back(sub_ret);//內(nèi)部while循環(huán)結(jié)束后,同一層的就完了,所以保存一層結(jié)果到ret中sub_ret.clear();//注意清空這個sub_ret,因為要重復利用到}return ret;} };思路二:變量控制
我們知道,在父節(jié)點出隊列的時候,會把它的孩子帶入到隊列中,也就是隊列的size本身保存的就是當前層的結(jié)點的個數(shù),所以我們可以通過一個變量level去控制,讓其一層一層的出。
class Solution { public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> vv;if(root==nullptr)return vv;queue<TreeNode*> queue_node;queue_node.push(root);while(!queue_node.empty()){int level=queue_node.size();//一層一層的出,level保存的就是當前層的所有結(jié)點的個數(shù)vector<int> v;while(level--){TreeNode* temp=queue_node.front();//出一個結(jié)點就把他的孩子結(jié)點帶入進去queue_node.pop();v.push_back(temp->val);//同一層結(jié)點放進同一個一維數(shù)組中if(temp->left)queue_node.push(temp->left);if(temp->right)queue_node.push(temp->right);}vv.push_back(v);//一層完畢加入一個結(jié)果}return vv;} };總結(jié)
以上是生活随笔為你收集整理的二叉树经典题之将二叉树分层打印的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 6-6-3:STL之map和set——m
- 下一篇: SSL证书类型