LintCode 二叉树的层次遍历

来源:互联网 发布:linux打包war文件 编辑:程序博客网 时间:2024/05/29 04:48

1.描述

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

样例

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

  3 / \9  20  /  \ 15   7

返回他的分层遍历结果:

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

2.分析

层次遍历是最符合我们平时逻辑的遍历方式,从上到下从左到右一层层的数下来就是层次遍历。

首先把根节点入队,之后开始执行出队操作,每出队一个节点就把该节点的左右孩子加入到队列

中(即下一层的节点),队头节点就是接下来要遍历的节点,直到叶子节点没有左右子树进而没有

新节点入队,知道队列为空时遍历结束。

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
        TreeNode *temp=new TreeNode('#');
        vector<int> v;//v为当前一层的节点值
        vector<vector<int>> w;//w为所有的小v,存放整个二叉树的节点值
        queue<TreeNode*> Q;
        if(root==NULL) return w;
        Q.push(root);//根节点入队
        Q.push(temp);//标志入队
        while(!Q.empty())
        {
            if(Q.front()==temp)//若队头为temp,说明上一层已经结束
            {
                if(Q.size()!=1)//若队列中只有一个temp,说明遍历已经结束了
                {
                    Q.push(temp);
                }
                w.push_back(v);//把当前层的小v加入到w中
                v.clear();//小v清空以存放下一层的节点值
                Q.pop();//队头出队
                continue;
            }
            v.push_back(Q.front()->val);
            if(Q.front()->left!=NULL)//左孩子不为空左孩子入队
            Q.push(Q.front()->left);
            if(Q.front()->right!=NULL)//右孩子不为空右孩子入队
            Q.push(Q.front()->right);
            Q.pop();
        }
        return w;
    }
};

4.总结

此题有一个很大的特点在于他最后返回的分层遍历结果为vector<vector<int>>,把每一层的节点值

存放在一个vector中,每一层的vector作为元素最终得到一个大的vector为整个二叉树。在队头出队时

需要判断是否为一层的节点,若为一层加入到小的vector中,若为下一层则把之前的小vector加入到

大vector中,之后小vector清空开始存放这一层的节点值。因此我定义了一个temp作为标志,首先根节点

入队紧接着让一个temp标志入队,代表这是一层,之后每次temp为队头时temp出队再在队尾入队一个temp

标志,又是一层结束的标志。


0 0
原创粉丝点击