按之字形顺序打印二叉树(剑指offer+队栈的应用)

按之字形顺序打印二叉树

  • 参与人数:703时间限制:1秒空间限制:32768K
  • 通过比例:25.31%
  • 最佳记录:0 ms|8552K(  )

题目描述

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

题意:看测试用例

测试用例:

{8,6,10,5,7,9,11}

对应输出应该为:

[[8],[10,6],[5,7,9,11]]

思路:用一个布尔量控制从左到右还是从右到左的顺序;先放入栈中,然后把他的左右孩子按照从左到右(或者从右向左)的顺序放入队中,按照本行的读取顺序;当本行结束之后,再把队中的数据放入栈中。就ok了

链接:http://www.nowcoder.com/practice/91b69814117f4e8097390d107d2efbe0?rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

/**
题目描述

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

*/
#include<cstdio>
#include<stack>
#include<queue>
#include<vector>
using namespace std;

struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
TreeNode *root;

class Solution {
public:
    vector<vector<int> > Print(TreeNode* pRoot) {
        vector<vector<int> >ans;
        if(pRoot==NULL) return ans;

        vector<int> arr;

        queue<TreeNode*> T;
        stack<TreeNode*> S;
        bool bo=true;   //用来记录,当前是从左向右还是从右向左
        int cnt=1;
        S.push(pRoot);

        while(!S.empty())
        {
            int tmp=0;
            TreeNode* p=S.top();
            S.pop();
            arr.push_back(p->val);
            TreeNode *left=p->left;
            TreeNode *right=p->right;
            cnt--;

            if(bo)
            {
                if(left!=NULL){T.push(left);}
                if(right!=NULL){T.push(right);}
            }
            else
            {
                if(right!=NULL){T.push(right);}
                if(left!=NULL){T.push(left);}
            }

            if(cnt==0)//一行结束
            {
                bo=!bo;
                ans.push_back(arr);
                arr.clear();
                while(!T.empty())
                {
                    TreeNode* q=T.front();
                    T.pop();
                    S.push(q);
                    cnt++;
                }
            }
        }
        return ans;
    }

};
TreeNode *Creat(int *pre,int *in,int n)
{
    TreeNode *s;
    for(int i=0;i<n;i++)
    {
        if(pre[0]==in[i])
        {
            s=new TreeNode(in[i]);
            //中序历遍中在根节点左边的都是左子树上的
            s->left=Creat(pre+1,in,i);
            //在根节点右边的,都是右子树上的,右子树需要从i+1开始
            s->right=Creat(pre+i+1,in+i+1,n-i-1);
            return s;
        }
    }
    return NULL;
}
int main()
{
    Solution so;
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        root=NULL;
        int a[2005],b[2005];
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        for(int i=0;i<n;i++)
            scanf("%d",&b[i]);
        root=Creat(a,b,n);
        vector<vector<int> >ans=so.Print(root);
        for(int i=0;i<ans.size();i++)
        {
            for(int j=0;j<ans[i].size();j++)
            {
                printf("%d ",ans[i][j]);
            }
            printf("\n");
        }
    }

    return 0;
}

/*
7
8 6 5 7 10 9 11
5 6 7 8 9 10 11
测试用例:
{8,6,10,5,7,9,11}

对应输出应该为:
[[8],[10,6],[5,7,9,11]]
*/

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 20:16:33

按之字形顺序打印二叉树(剑指offer+队栈的应用)的相关文章

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

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

从上往下打印二叉树-剑指Offer

从上往下打印二叉树 题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路 数据结构:队列 将树按层遍历,先将根节点的左右子节点先后进入队列,然后再先后从队列取出,然后将取出的节点的左右子节点再入队列 循环进行,直到队列为空 代码 import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; /** public class TreeNode { int val = 0; Tree

从上往下打印二叉树(剑指offer)+队列的应用

从上往下打印二叉树 参与人数:1577时间限制:1秒空间限制:32768K 通过比例:25.53% 最佳记录:0 ms|0K(来自  dust347) 题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 题意:就是树的层次遍历.想象一下,从根结点依次往下,每行从左到右,这不就是是入队和出队的操作嘛! so...代码很容易吧. /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; Tr

《剑指offer》:[61]按之字形顺序打印二叉树

题目:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三层再按照从左到右打印,其他行以此类推. 例如:按之字形顺序打印二叉树的结果如下图: 打印结果: 1 3,2 4,5,6,7 15,14,13,12,11,10,9,8 方案:利用两个栈.时间复杂度O(N)+辅助空间2*O(N). 具体方法:我们在打印某一结点时,把下一层的子结点保存到相应的栈里.如果当前打印的是奇数层(例如第一层,第三层...第2*n+1层),则先保存左子结点再保存右子

按之字形顺序打印二叉树

题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推 /* 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之栈的压入、弹出序列(九度OJ1366)

题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列. 输入: 每个测试案例包括3行: 第一行为1个整数n(1<=n<=100000),表示序列的长度. 第二行包含n个整数,表示栈的压入顺序. 第三行包含n个整数,表示栈的弹出顺序. 输出: 对应每个测试案例,如果第二个序列是

【剑指offer】栈的压入弹出序列

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26077863 剑指offer上的第22题,九度OJ上AC. 题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列. 输入: 每个测试案例包括3行: 第一行为1个整数n(

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

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

剑指offer(五十三)之按之字形顺序打印二叉树

题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 代码: <span style="color:#000099;">import java.util.ArrayList; import java.util.*; /* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = n