lintcode——二叉树的层次遍历

来源:互联网 发布:淘宝的快递软件叫啥 编辑:程序博客网 时间:2024/04/29 06:45


1、题目

     给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问)

样例

给一棵二叉树 {3,9,20,#,#,15,7}

  3 / \9  20  /  \ 15   7

返回他的分层遍历结果:

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

2、思路

  层次遍历比前、中、后序遍历多了一些要处理的问题,比如:如何将每一层放进一组里?怎么保证层与层之间是在不同分组里面?

  层次遍历就要考虑用队列来存放数据了,所以首先把根节点放进队列,之后开始每次判断队列不空则要建立一个vector来存每一层的数,为了隔开每一层的数一定要记得对vector里push完一层就要清空队始列!!最后把每一个小分组push进一个向量里面。

 至于该到什么时候停止一层数据的划分,就要对每一层数据的个数计数

  我觉得以上两点是最重要的操作了。

 

3、代码

/**
 * Definition of TreeNode:
 * class TreeNode {
 * public:
 *     int val;
 *     TreeNode *left, *right;
 *     TreeNode(int val) {
 *         this->val = val;
 *         this->left = this->right = NULL;
 *     }
 * }
 */
 
 
class Solution {
    /**
     * @param root: The root of binary tree.
     * @return: Level order a list of lists of integer
     */
public:
    vector<vector<int>> levelOrder(TreeNode *root) {
        // write your code here
    vector<vector<int>>T;
    queue<TreeNode*>q;
    if(root==NULL)
       { return T; }
    q.push(root);
    int length=1;
    while(!q.empty())
        {
            vector<int> t;
            length=q.size();
                while(length--)
                {
                    TreeNode *temp=q.front();
                    t.push_back(temp->val);
                    q.pop();
                    if(temp->left)
                        q.push(temp->left);
                    if(temp->right)
                        q.push(temp->right);
                }
             T.push_back(t);
        }
        return T;
    }
};

4、感想

思路里提到的两点,觉得以后还会用到的,尤其是计数。

层次遍历试了好几遍才ac,一直在纠结该怎么实现停止向队列里放元素,计数啊计数啊!!

这道题目要求的输出格式很有意思~~点赞!    

0 0
原创粉丝点击