您的位置:首页 > 其它

二叉树的层次遍历

2017-04-10 22:46 204 查看
一、问题描述

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

样例

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

返回他的分层遍历结果:
[
[3],
[9,20],
[15,7]
]


二、解题思路

       定义两个vector容器,一个存储每一层的节点(r),另一个存储层次遍历的结果(p),然后定义一个队列q,然后定义一个指针x指向队列的头结点,即根节点,并把节点放入r中,然后再弹出(因为队列有先进先出的原则),队列长度减一。再放入左子树和右子树,直到队列的长度为0跳出循环。要注意r存储完一层节点放入p中就清空,然后再存储下一层节点,这样即实现了二叉树的层次遍历啦。

三、我的代码

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) {

       vector<int> r;

       vector<vector <int>> p;

       if(root==NULL) return p;

       queue<TreeNode*>q;

       q.push(root);

       while(!q.empty())

       {

           int l=q.size();

           while(l!=0)

           {

               TreeNode *x=q.front();

               r.push_back(x->val);

               q.pop();

               l--;

               if(x->left!=NULL)  q.push(x->left);

               if(x->right!=NULL)  q.push(x->right);

           }

           p.push_back(r);

           r.clear();

       }

       return p;

    }

};

四、我的感想

 
   层次遍历较前面三个遍历有所不同,层次遍历要定义队列,因为队列的先进先出原则可以使问题简单化,还要注意队列的弹出,这道题一开始思路不是很清晰,又上网查了一下,感觉也回顾了不少以前的知识。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: