二叉树的层次遍历

来源:互联网 发布:java b2b2c 编辑:程序博客网 时间:2024/06/07 01:21

一、问题描述

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

样例

给一棵二叉树 {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;
    }
};

四、我的感想

    层次遍历较前面三个遍历有所不同,层次遍历要定义队列,因为队列的先进先出原则可以使问题简单化,还要注意队列的弹出,这道题一开始思路不是很清晰,又上网查了一下,感觉也回顾了不少以前的知识。


0 0
原创粉丝点击