之字型顺序打印二叉树(双端队列)

请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。

 

例如:

给定二叉树: [3,9,20,null,null,15,7],

    3

   / \

  9 20

    / \

   15 7

 

返回其层次遍历结果:

[

  [3],

  [20,9],

  [15,7]

]

 

提示:

节点总数 <= 1000

 

解题思路:

使用层序遍历二叉树,奇数层则从队头先左后右打印,从队尾先左后右加入下层结点,偶数层则从队尾先右后左打印,从队头先右后左加入下层结点。

 

算法流程:

1.创建存储数组的数组res

2.如果树为空,返回res

3.创建双端队列q,并把树的根结点从队尾入队

4.循环直到队列为空

               定义一个数组tmp

               奇数层循环

                       定义结点node存储队头元素

                       node存入tmp,队头元素出队

                       把node的左孩子从队尾入队

                       把node的右孩子从队尾入队

               把tmp存入res

               如果队列为空,则跳出循环

               把tmp清空

               偶数层循环

                       定义结点node存储队尾元素

                       node存入tmp,队尾元素出队

                       把node的右孩子从队头入队

                       把node的左孩子从队头入队

                把tmp存入res

5.返回res

 

代码:

class Solution {

public:

    vector<vector<int>> levelOrder(TreeNode* root) {

    vector<vector<int>> res;

    if(root==nullptr) return res;

    deque<TreeNode*> q;

    q.push_back(root);

    while(!q.empty()) {

        vector<int> tmp;

        for(int i=q.size();i>0;i--) {

            TreeNode* node=q.front();

            tmp.push_back(node->val);

            q.pop_front();  

            if(node->left!=nullptr)

            q.push_back(node->left);

            if(node->right!=nullptr)

            q.push_back(node->right);

        }

        res.push_back(tmp);

        if(q.empty()) break;

        tmp.clear();

        for(int i=q.size();i>0;i--) {

            TreeNode* node=q.back();

            tmp.push_back(node->val);

            q.pop_back();   

            if(node->right!=nullptr)

            q.push_front(node->right);

            if(node->left!=nullptr)

            q.push_front(node->left); 

        }

        res.push_back(tmp);

    }

    return res;

    }

};

 

运行步骤:

    3

   / \

  9 20

   / \

15  7

 

3入队

队列[3],node=3, 3出队,tmp:[3],

9,20入队,res:[[3]]

队列[9,20],node=20, 20出队

tmp:[20],7,15入队,

队列[9],node=20, 20出队

tmp:[20 9]   res:[[3] [20 9]]

队列[15,7],node=15, 15出队

tmp:[15],队列[7],node=7, 7出队

tmp:[15,7],res:[[3] [20 9] [15 7]]

返回res:[[3] [20 9] [15 7]]

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值