牛客BM27-按之字形打印二叉树-C++

一、题目

 

二、思路

按层打印二叉树,很容易想到的是用层次遍历,由于相邻两层的结点打印顺序是相反的(若上一次是从左往右,则下一层为从右往左),比较直接的做法是用两个栈实现,因为栈可以实现逆序,一个栈从左往右保存当前层结点,另一个栈从右往左保存下一层结点,再次逆序之后间隔一层的两个层之间的顺序又变为相同,用一个变量flag来标识当前层应该对哪个栈进行处理。

三、代码

class Solution {
public:
    vector<vector<int> > Print(TreeNode* pRoot) {
        vector<vector<int>> ans;
        if(pRoot == NULL) return ans;
        stack<TreeNode*> st1; //两个栈交替各层结点
        stack<TreeNode*> st2;//若当前层是st1保存,则下一层为st2保存
        bool flag = true; //标识是哪个栈保存着节点
        st1.push(pRoot);
        while(!st1.empty() || !st2.empty()){ //每次循环处理一层
            vector<int> layer; //当前层的结点值
            if(flag){ //st1中保存着结点
                int num1 = st1.size();
                for(int i=0; i<num1; i++){
                    TreeNode* tmp = st1.top();
                    layer.push_back(tmp->val);
                    if(tmp->left)  //从左往右处理
                        st2.push(tmp->left);
                    if(tmp->right)
                        st2.push(tmp->right);
                    st1.pop();
                }                
            }
            else{ //st2中保存着当前层结点
                int num2 = st2.size();
                for(int j=0; j<num2; j++){
                    TreeNode* tmp = st2.top();
                    layer.push_back(tmp->val);
                    if(tmp->right) //从右往左处理
                        st1.push(tmp->right);
                    if(tmp->left)
                        st1.push(tmp->left);
                    st2.pop();
                }
            }
            ans.push_back(layer);
            flag = !flag; //转换为另一个栈处理节点
        }
        return ans;
    }
};

四、运行结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值