leetcode 題解:Binary Tree Level Order Traversal (二叉樹的層序遍曆)

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   strong   

題目:

Given a binary tree, return the level order traversal of its nodes‘ values. (ie, from left to right, level by level).

For example:
Given binary tree {3,9,20,#,#,15,7},

    3   /   9  20    /     15   7

 

return its level order traversal as:

[  [3],  [9,20],  [15,7]]

 

confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ.

說明:

       1)層序遍曆,每層單獨輸出,順序:從上到下,從左至右(思考:從下到上,從右至左如何?下面會說明)

       2)實現也分遞迴和迭代,其中迭代貼出了兩種實現(思想基本相同)

實現:

一、遞迴實現

 1 /** 2  * Definition for binary tree 3  * struct TreeNode { 4  *     int val; 5  *     TreeNode *left; 6  *     TreeNode *right; 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8  * }; 9  */10 class Solution {11     public:12     vector<vector<int> > levelOrder(TreeNode *root) {13         vector<vector<int>> result;14         traverse(root,1,result);15         return result;16     }17     void traverse(TreeNode *root,size_t level,vector<vector<int>> &result)18     {19         if(root==nullptr) return;20         if(level>result.size()) result.push_back(vector<int>());21         result[level-1].push_back(root->val);22         traverse(root->left,level+1,result);23         traverse(root->right,level+1,result);24     }25 };

二、迭代實現
a 迭代實現1
 1 /** 2  * Definition for binary tree 3  * struct TreeNode { 4  *     int val; 5  *     TreeNode *left; 6  *     TreeNode *right; 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8  * }; 9  */10  /*常規層序遍曆思想,每層入隊結束壓入一個空節點,作為標誌*/11 class Solution {12 public:13     vector<vector<int> > levelOrder(TreeNode *root) {14         vector<vector<int>> vec_vec_tree;//建立空vector,存放最後返回的遍曆二叉樹的值15         vector<int> level;//建立空的vector,存放每一層的遍曆二叉樹的值16         TreeNode *p=root;17         if(p==nullptr) return vec_vec_tree;//如果二叉樹空,返回空vector<vector<int>> 18         queue<TreeNode *> queue_tree;//建立一個空隊列19         queue_tree.push(p);//root節點入隊列20         queue_tree.push(nullptr);//空節點入隊列21         while(!queue_tree.empty())//直到隊列為空白22         {23             p=queue_tree.front();    //頭結點取值,並出隊列24             queue_tree.pop();25             if(p==nullptr&&!level.empty())//節點為空白並且隊列不為空白26             {27                 queue_tree.push(nullptr);//入隊空節點,與下一層隔開28                 vec_vec_tree.push_back(level);//已遍曆的層入隊29                 level.clear();//清空vecor level30             }31             else if(p!=nullptr)//如果節點不空32             {33             level.push_back(p->val);//遍曆34             if(p->left) queue_tree.push(p->left);//若有左右孩子,則入隊列35             if(p->right) queue_tree.push(p->right);//注意入隊順序:先左後右36             }37             38         }39         return vec_vec_tree;40     }41 };

   b 迭代實現2

 1 /** 2  * Definition for binary tree 3  * struct TreeNode { 4  *     int val; 5  *     TreeNode *left; 6  *     TreeNode *right; 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8  * }; 9  */10  /*兩個隊列實現*/11 class Solution {12 public:13     vector<vector<int> > levelOrder(TreeNode *root) {14         vector<vector<int> > result;15         if(root == nullptr) return result;16          queue<TreeNode*> current, next;//兩個隊列,儲存當層(current)和下層(next)節點17         vector<int> level; // 存放每層的節點值18         current.push(root);19         while (!current.empty())//直到二叉樹遍曆完成20         {21             while (!current.empty())//直到本層二叉樹遍曆完成22             {23                 TreeNode* node = current.front();//取隊首節點,出隊列24                 current.pop();25                 level.push_back(node->val);//訪問節點值26                 if (node->left != nullptr) next.push(node->left);//若存在左右節點,則壓入next隊列中27                 if (node->right != nullptr) next.push(node->right);//注意入隊順序為先left後right28             }29             result.push_back(level);//壓入總vector30             level.clear();//清vector31             swap(next, current);//next隊列和current隊列交換32         }33         return result;34         }35     };

 

最後說明:如果 從下到上,從右至左如何遍曆,如何?

     我的想法:從下到上,直接把結果vector<vector<int>>逆序即可

             從右至左,把入隊順序改為先右後左即可

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.