AcWing 45. 之字形打印二叉树

地址 https://www.acwing.com/problem/content/description/43/

题目描述
请实现一个函数按照之字形顺序从上向下打印二叉树。

即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。

样例

输入如下图所示二叉树[8, 12, 2, null, null, 6, 4, null, null, null, null]
    8
   /   12  2
     /     6   4
输出:[[8], [2, 12], [6, 4]]

算法1
在上一题的基础上 加上了一个左右打印标志 如果标志为真 则逆向一下输入的vector

C++ 代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> res;
    queue<TreeNode*>  que;
    int leftToright = 1;

    void bfs()
    {

        while(!que.empty()){
            vector<int> lineVec;
            while(!que.empty() && NULL != que.front() ){
                TreeNode* p = que.front();
                que.pop();
                lineVec.push_back(p->val);
                if(p->left!=NULL)
                    que.push(p->left);
                if(p->right!=NULL)
                    que.push(p->right);
            }
            if(leftToright == 1){
              reverse(lineVec.begin(),lineVec.end());
            }
            res.push_back(lineVec);
            leftToright = !leftToright;

            if(!que.empty()){
                que.pop();
            }
            if(!que.empty()){
                que.push(NULL);
            }
        }
    }

    vector<vector<int>> printFromTopToBottom(TreeNode* root) {
        if(root == NULL) return res;
        que.push(root); que.push(NULL); leftToright = !leftToright;
        bfs();

        return res;
    }
};

作者:defddr
链接:https://www.acwing.com/solution/acwing/content/3662/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

原文地址:https://www.cnblogs.com/itdef/p/11331038.html

时间: 2024-10-10 04:20:51

AcWing 45. 之字形打印二叉树的相关文章

剑指:之字形打印二叉树

题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 如二叉树: 1 / 2 3 / \ / 4 5 6 7 打印结果为: 1 3 2 4 5 6 7 解法 之字形打印,即先从左到右,后从右到左,借助栈结构实现: 两个辅助栈:一个存放奇数层节点的栈s1,一个存放偶数层节点的栈s2. s1栈中的节点弹出,其节点的 左->右 孩子进s2栈: s2栈中的节点弹出,其节点的 右->左 孩子进s1栈:

《剑指offer》第三十二题III:之字形打印二叉树

// 面试题32(三):之字形打印二叉树 // 题目:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺 // 序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印, // 其他行以此类推. #include <cstdio> #include "BinaryTree.h" #include <stack> void Print(BinaryTreeNode* pRoot) { //整体思路和前两道题很像,先进先出变后进先出 if

【剑指Offer-举例让抽象问题具体化】面试题32.2:之字形打印二叉树

题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 思路 使用两个栈s1,s2:s1用来存储奇数层的节点,s2用来存储偶数层的节点(层数从1开始): 先将根结点压入s1: 当前层是奇数层时,弹出s1中的节点,并将弹出节点的左孩子.右孩子依次压入到s2中,直至s1为空: 当前层是偶数层时,弹出s2中的节点,并将弹出节点的右孩子.左孩子依次压入到s1当中,直至s2为空: 重复前面两步,直至s1,s

之字形打印二叉树

问题最关键的是用了栈和队列两个数据结构.在层次遍历的过程中,同时将节点保存到栈中. vector<vector<int>> zigzagLevelOrder(TreeNode* root) { vector<vector<int>> result; if(root==NULL) return result; vector<int> tempRes; stack<TreeNode *>st; queue<TreeNode *>

59、剑指offer--按之字形顺序打印二叉树

题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 解题思路:通过分析,使用栈进行存储结点 打印1时,将结点2 3 放入栈中,打印3时,将3的左右孩子67分别放入栈中想放入7 再放6. 通过举例分析,对于父结点在偶数行,先放入右子结点.再放入左子结点(栈2),对于父结点在奇数行,先放入左子结点再放入右子结点(栈1).因此使用两个栈进行存储. 使用两个栈的原因,例如2 3 都在栈中,弹出3,需要

59按之字形顺序打印二叉树

题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 需要2个桟(后进先出). 我们在打印某一行节点时,把下一层的子节点保存到相应的桟里.如果当前打印的是奇数层,则先保存左子树再保存右子树节点到 第一个桟里,如果当前打印的是偶数层,则先保存右子树再保存左子树节点. 1 import java.util.ArrayList; 2 import java.util.Stack; 3 /* 4 pub

剑指offer 按之字形顺序打印二叉树

题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 思路: 1.有了之前层次遍历一行一行输出的经验,我们可以直接用一个变量记录行数,如果是奇数行,就将队列中的元素按顺序所有保存下来,如果是偶数行,就顺序保存到一个临时vector中,再逆序保存下来. 1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5 struct Tre

按之字形顺序打印二叉树

题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; */ class Solution { public: vector<vect

按之字形顺序打印二叉树-剑指Offer

按之字形顺序打印二叉树 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 思路 根据题意,每行的节点的访问顺序是相反的,我们可以用两个栈来隔行存储,一个栈中根据“左结点->右结点”的顺序访问另一个栈的栈顶元素,而另一个栈根据“右子树->左子树”的顺序访问另一个栈的栈顶元素,直到两个栈都为空 代码 import java.util.ArrayList; import java.util.St