按之字形顺序打印二叉树

按之字形顺序打印二叉树

题目描述

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

解题思路

  • 因为是按照之字形打印,所以要用。如果是层序打印,用到的是队列
  • 每次从左到右遍历的时候,把下一层的节点按照左-右的顺序入栈,这样就能够实现下层节点以右-左的顺序出栈
  • 每次从右到左遍历的时候,把下一层的节点按照右-左的顺序入栈,这样就能够实现下层节点以左-右的顺序出栈
  • 遍历每一层的节点存储在临时数组temp中,每遍历完一层,就将其加入到结果中,实现之字形打印
class Solution {
public:
    vector<vector<int> > Print(TreeNode* pRoot) {
        vector<vector<int> > ans;
        if(pRoot==NULL) return ans;
        vector<int>temp;
        //需要两个栈
        stack<TreeNode *>st[2];
        int cur=0,next=1;
        st[cur].push(pRoot);
        while(!st[cur].empty() || !st[next].empty()){
            TreeNode *now=st[cur].top();
            st[cur].pop();
            temp.push_back(now->val);
            if(cur==0){//cur和next交替,以此判断当前打印方向
                //往下一层的栈中push,当前层是从左到右,下一层是从右到左,按左-右的顺序入栈
                if(now->left) st[next].push(now->left);
                if(now->right) st[next].push(now->right);
            }else{
                //当前是从右到左,下一层是从左到右,所以按右-左的顺序入栈,就能实现左-右的出栈顺序
                if(now->right) st[next].push(now->right);
                if(now->left) st[next].push(now->left);
            }
            //遍历完当前层以后,该层节点放入结果中
            if(st[cur].empty()){
                ans.push_back(temp);
                temp.clear();
                cur=1-cur; //当前栈空了,换下一个栈为当前栈
                next=1-next;
            }
        }
        return ans;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值