二叉树进阶练习——二叉树的层序遍历(I&II)

1.题目解析

题目来源(I):102.二叉树的层序遍历

测试用例(I)

题目来源(II): 107.二叉树的层序遍历 II

测试用例(II): 

2.算法原理

这里的层序遍历主要的目的是取出二叉树每一层的数据,并且将其存入一个二维数组中,主要难点是如何准确的将每一层数据取出,解决的方法是创建临时变量levelsize,具体操作如下:

1.创建一个二维数组与队列,队列用来取出每一层数据,二维数组用来存储每一层数据,创建临时变量levelsize来记录每一层数据个数(取出一层后,此时队列中所有元素个数)

2.首先对根节点特殊处理,然后处理其他子节点,取出每一个节点都要判断是否需要将其左右子结点入队列,不为空则入队列,然后将这一层数据先存入一个一维数组中

3.更新levelsize,此时队列中所以元素就是下一层数据,则队列此时的长度就是levelsize,然后将一维数组的数据存入二维数组,然后更新下一层数据,直到队列为空则结束

4.第二道题只用将第一道题的结果翻转顺序即可

3.实战演练

102.二叉树的层序遍历 

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) 
    {
         //创建一个二维数组来存储每一层的信息
        vector<vector<int>> vv;
        //创建一个队列用来取出每一层数据
        queue<TreeNode*> q;
        int levelSize = 0;//控制层数

        //对根节点特殊处理
        if(root)
        {
            q.push(root);
            levelSize = 1;
        }

        //保证队列不为空就可以一直操作
        while(!q.empty())
        {
            vector<int> v;
            while(levelSize--)
            {
                //进入该层树节点
                TreeNode* front = q.front();
                q.pop();
                v.push_back(front->val);

                //进入下一层树节点
                if(front->left)
                {
                    q.push(front->left);
                }

                if(front->right)
                {
                    q.push(front->right);
                }
            }
            //二维数组中存储每一层的数据
            vv.push_back(v);
            //此时栈内数据个数就是本层所有数据,直接取出即可
            //需要使用levelSize来保证完全取出
            levelSize = q.size();
        }
        return vv;
    }
};

107.二叉树的层序遍历 II 

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> levelOrderBottom(TreeNode* root) 
    {
        //创建二维数组存储数据,队列处理数据
        vector<vector<int>> vv;
        queue<TreeNode*> q;
        int levelsize = 0;

        //特殊处理根节点
        if(root)
        {
            q.push(root);
            levelsize = 1;
        }

        //当队列不为空则执行后续操作
        while(!q.empty())
        {
            vector<int> v;
            //逐层取出数据
            while(levelsize--)
            {
                //队列先进先出,取出头部数据
                TreeNode* front = q.front();
                //删除头部数据
                q.pop();
                //插入到一维数组
                v.push_back(front->val);

                //判断下一层是否为空,不为空则继续入队列
                if(front->left)
                {
                    q.push(front->left);
                }
                if(front->right)
                {
                    q.push(front->right);
                }
            }
            //此时出完一层更新下一层数据个数
            levelsize = q.size();
            //将该层数据存入二维数组中
            vv.push_back(v);
        }
        //要求自底向上,需要翻转
        reverse(vv.begin(),vv.end());

        return vv;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值