剑指offer系列49:把二叉树打印成多行

有了上一个之字形打印二叉树,这个题就比较简单了。

首先分析这道题的结构,一行一行的输出。

1.如果第一行顺序存储,也就是先存左边在存右边。那么输出的时候也要同样的先左边后右边的顺序。这就是先进先出,所以用队列。

2.如果不顺序存,使用栈来存。第二行就先右边在左边,必须这样第一行输出的时候才可以先左后右。存第三行是根据第二行的弹出顺序决定的。因为第二行的弹出顺序是从左向右,所以第三行的第一个元素必须是第二行左边元素的子树。也就是在栈底。也就是说第三行开始的元素放在栈底只能最后输出,这样必然是不对的。

class Solution {
public:
    vector<vector<int> > Print(TreeNode* pRoot) {
        vector<vector<int> > re;
        if (pRoot == NULL)
            return re;
        deque<TreeNode*> st[2];

        vector<int> aux;

        int cur = 0;
        int next = 1;
        st[cur].push_front(pRoot);
        while (!st[0].empty()|| !st[1].empty())
        {
            TreeNode *pnode = st[cur].front();
            st[cur].pop_front();//从队列前面出
            aux.push_back(pnode->val);

            //要求输出:左-》右
            if (pnode->left)
                st[next].push_back(pnode->left);//从队列后面进
            if (pnode->right)
                st[next].push_back(pnode->right);//从队列后面进

            if (st[cur].empty())//一行全部输出
            {
                re.push_back(aux);
                aux.clear();
                cur = 1 - cur;
                next = 1 - next;
            }
        }
        return re;
    }

};

原文地址:https://www.cnblogs.com/neverland0718/p/11254397.html

时间: 2024-12-24 16:57:13

剑指offer系列49:把二叉树打印成多行的相关文章

《剑指offer》:[60]把二叉树打印成多行

题目:从上到下安层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印一行. 例如,图(1)中二叉树以及打印结果为: 这个题其实很简单,我们只需要设置两个变量就可以搞定.一个变量表示当前层中还没有打印的结点数,另一个变量表示下一层结点的数目. 具体实现代码如下: #include <iostream> #include <queue> using namespace std; struct BinaryTree { int data; BinaryTree *pLeft; Bi

剑指offer系列源码-二叉树中和为某一值的路径

输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. #include <iostream> #include<stdio.h> #include<vector> using namespace std; struct BinaryTreeNode{ int value; BinaryTreeNode* left; BinaryTreeNode* right; }; //递归判断路劲

剑指offer系列32-----对称二叉树的判断

[题目]请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 1 package com.exe7.offer; 2 3 /** 4 * [题目]请实现一个函数,用来判断一颗二叉树是不是对称的. 5 * 注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 6 * @author WGS 7 * 8 */ 9 public class SymmetricalTreeNode { 10 public class TreeNode{

剑指offer系列源码-二叉树的镜像

输入一个二叉树,输出其镜像. 解法:交换所有非叶子结点的左右结点. #include<stdio.h> #include<iostream> using namespace std; struct BinaryTreeNode{ int value; BinaryTreeNode* left; BinaryTreeNode* right; }; //树的镜像 void reseverBinaryTree(BinaryTreeNode* root){ if(root==NULL||(

剑指offer系列——从尾到头打印链表

Q:输入一个链表,按链表从尾到头的顺序返回一个ArrayList. C:时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32M,其他语言64M T: 1.我直接用的reverse函数.这道题需要注意的,就是链表为空的情况.不过--应该<数据结构>里经常提到了. # include <algorithm> vector<int> printListFromTailToHead(ListNode* head) { vector<int> Array

剑指offer系列53---字符串转化成整数

[题目]将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数 * []整数(32位)最大值:0X7fff ffff( 0111 1111 1111 1111 1111 1111 1111 1111 (0代表正号)) * 最小值:0x8000 0000( 1000 0000 0000 0000 0000 0000 0000 0000 (1代表负号)) 1 package com.exe10.offer; 2 3 /** 4 * [题目]将一个字符串转换成一个整数,要求不能使用字符串转换整

剑指offer系列——二维数组中,每行从左到右递增,每列从上到下递增,设计一个算法,找其中的一个数

题目:二维数组中,每行从左到右递增,每列从上到下递增,设计一个算法,找其中的一个数 分析: 二维数组这里把它看作一个矩形结构,如图所示: 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 在做这道题的时候我最先考虑的是每次比较对角线上的元素可能可以取得较好的效果, 以查找9为例, 从1(0,0)开始,1<10,可以得出结论,10在1的右侧或下侧: 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 然后看4(1,1),4<9, 1 2 8 9 2

剑指Offer:二叉树打印成多行【23】

剑指Offer:二叉树打印成多行[23] 题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 题目分析 Java题解 package tree; import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; public class PrintByLevel { public static void main(String[] args) { TreeNode t1 = n

把二叉树打印成多行-剑指Offer

把二叉树打印成多行 题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 思路 都是从左往右打印,我们可以使用队列 若要一行一行区别开来打印,我们可以用两个队列 也可以用一个队列,然后用两个标志位来标注哪些是属于一行里的结点,一个指针指向下一行的最后一个进队列的(point),一个指针指向上一行最后一个进入队列的(end),当出队列到end时,打印上一行,然后把end指针下移到下一行point处,继续循环打印 代码 import java.util.ArrayList; i