首页 > 其他 > 详细

[LintCode 69. ] 二叉树的层次遍历

时间:2021-01-11 11:56:42      阅读:19      评论:0      收藏:0      [点我收藏+]

LintCode 69. 二叉树的层次遍历

问题描述

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

样例

样例 1:
输入:{1,2,3}
输出:[[1],[2,3]]
解释:
   1
  /  2   3
它将被序列化为{1,2,3}

样例 2:
输入:{1,#,2,3}
输出:[[1],[2],[3]]
解释:
1
   2
 /
3
它将被序列化为{1,#,2,3}

挑战

挑战1:只使用一个队列去实现它

挑战2:用BFS算法来做

注意事项

首个数据为根节点,后面接着是其左儿子和右儿子节点值,"#"表示不存在该子节点。
节点数量不超过20。

解题思路

这道题相对以往依次输出元素的层次遍历有了一点变动,要求每一层的元素为一组来进行输出。
解决办法是,相对应的,队列中的结点也分组来入队出队操作。
更进一步,一次只操作一层结点并生成下一层的结点,那么取消队列,直接使用两个数组保存结点并轮换也是可以的。

参考代码

/**
 * Definition of TreeNode:
 * class TreeNode {
 * public:
 *     int val;
 *     TreeNode *left, *right;
 *     TreeNode(int val) {
 *         this->val = val;
 *         this->left = this->right = NULL;
 *     }
 * }
 */

class Solution {
public:
    /**
     * @param root: A Tree
     * @return: Level order a list of lists of integer
     */
    vector<vector<int>> levelOrder(TreeNode * root) {
        // write your code here
        if (root == NULL) return {};

        vector<TreeNode*> level;
        vector<TreeNode*> next;
        level.push_back(root);
        vector<vector<int>> res;
        vector<int> v;
        while (!level.empty()) {
            v.clear();
            next.clear();
            for (auto&& x : level) {
                v.push_back(x->val);
                if (x->left) {
                    next.push_back(x->left);
                }
                if (x->right) {
                    next.push_back(x->right);
                }
            }
            res.push_back(v);
            level.swap(next);
        }
        return res;
    }
};

[LintCode 69. ] 二叉树的层次遍历

原文:https://www.cnblogs.com/zhcpku/p/14261110.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!