从上到下打印二叉树

1.Ⅰ

从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
在这里插入图片描述
链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-lcof/

采用二叉树的层序遍历:可采用递归和迭代的方式遍历

1.1递归

先保存根节点的值,再保存左右节点的值,并进行递归,当当前节点为空时,则直接返回。

代码:

class Solution {
public:
    vector<int> ret;//返回的vector
    vector<int> levelOrder(TreeNode* root) {
        if(root == nullptr)
            return {};
        _levelOrder(root);
        return ret;
    }
private:
    void _levelOrder(TreeNode* root)
    {
        if(root == nullptr)
            return;
        ret.push_back(root->val);//先保存根节点
        _levelOrder(root->left);//左子树
        _levelOrder(root->right);//右子树
    }
};

1.2 迭代

迭代时,需要借助一个辅助队,在队不为空时,保存根节点,再分别对其左右子树进行入队操作。

代码:

class Solution {
public:
    vector<int> ret;
    vector<int> levelOrder(TreeNode* root) {
        if(root == nullptr)
            return {};
        queue<TreeNode*> _que;
        _que.push(root);
        while(!_que.empty())
        {
            int sz = _que.size();//获取当前队列中元素个数
            for(int i = 0; i < sz; ++i)//循环出队
            {
                TreeNode* tmp = _que.front();
                _que.pop();
                ret.push_back(tmp->val);//保存该根节点的值
                if(tmp->left != nullptr)//左不空,先入左
                    _que.push(tmp->left);
                if(tmp->right != nullptr)//右不空,入右
                    _que.push(tmp->right);
            }
        }
        return ret;
    }
};

2.Ⅱ

题目描述:
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。

在这里插入图片描述
链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-ii-lcof/

依然是对二叉树的层序遍历,只不过保存值的方式不同。

2.1 递归

代码:

class Solution {
public:
    vector<vector<int>> vv;
    vector<vector<int>> levelOrder(TreeNode* root) {
        if(root == nullptr)
            return vv;
        _levelOrder(root, 0);
        return vv;
    }
private:
    void _levelOrder(TreeNode* root, int index)
    {
        if(root == nullptr)
            return;
        if(index >= vv.size())//对每一层分开保存一个vector
            vv.push_back(vector<int>());
        vv[index].push_back(root->val);//当前层保存节点值
        _levelOrder(root->left, index + 1);//左右孩子分别在一下层中保存节点值
        _levelOrder(root->right, index + 1);
    }
};

2.2 迭代

代码:

class Solution {
public:
    vector<vector<int>> vv;
    vector<vector<int>> levelOrder(TreeNode* root) {
        if(root == nullptr)
            return vv;
        queue<TreeNode*> _que;
        _que.push(root);
        int index = 0;//下标,记录当前vector<vector>中,有几个vector
        while(!_que.empty())
        {
            int sz = _que.size();
            vv.push_back(vector<int>());
            for(int i = 0; i < sz; ++i)//这里的元素个数就相当于目前层中,有几个元素
            {
                TreeNode* tmp = _que.front();
                _que.pop();
                vv[index].push_back(tmp->val);
                if(tmp->left != nullptr)
                    _que.push(tmp->left);
                if(tmp->right != nullptr)
                    _que.push(tmp->right);
            }
            ++index;
        }
        return vv;
    }
};

3.Ⅲ

题目描述:
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
在这里插入图片描述

链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-iii-lcof/
依然是对二叉树的层序遍历,只不过保存值的方式不同。

3.1 递归

将层序遍历后的二维vector进行逆置。

代码:

class Solution {
public:
    vector<vector<int>> vv;
    vector<vector<int>> levelOrder(TreeNode* root) {
        if(root == nullptr)
            return vv;
        _levelOrder(root, 0);
        for(int i = 1; i < vv.size(); i += 2)//逆置偶数行
        	reverse(vv[i].begin(), vv[i].end());
        return vv;
    }
private:
    void _levelOrder(TreeNode* root, int index)
    {
        if(root == nullptr)
            return;
        if(index >= vv.size())
            vv.push_back(vector<int>());
        vv[index].push_back(root->val);
        _levelOrder(root->left, index + 1);
        _levelOrder(root->right, index + 1);
    }
};

3.2 迭代

代码:

class Solution {
public:
    vector<vector<int>> vv;
    vector<vector<int>> levelOrder(TreeNode* root) {
        if(root == nullptr)
            return vv;
        queue<TreeNode*> _que;
        int index = 0;
        _que.push(root);
        while(!_que.empty())
        {
            int sz = _que.size();
            vv.push_back(vector<int>(sz));//直接将该vector中元素给定
            for(int i = 0; i < sz; ++i)
            {
                TreeNode* tmp = _que.front();
                _que.pop();
                if(index % 2 == 0)//不会逆置
                    vv[index][i] =  tmp->val;
                else//会逆置,则从后往前赋值
                    vv[index][sz - i - 1] =  tmp->val;
                if(tmp->left != nullptr)
                    _que.push(tmp->left);
                if(tmp->right != nullptr)
                    _que.push(tmp->right);
            }
            ++index;
        }
        return vv;
    }
};
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页