我是靠谱客的博主 威武香烟,最近开发中收集的这篇文章主要介绍之字型顺序打印二叉树(双端队列),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

 

例如:

给定二叉树: [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]]

 

 

最后

以上就是威武香烟为你收集整理的之字型顺序打印二叉树(双端队列)的全部内容,希望文章能够帮你解决之字型顺序打印二叉树(双端队列)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部