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