刷题 - 按之字形打印二叉树

题目描述:

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

解题思路:

从题目分析可知,题目的意思是:从上到下,单数行从左到右打印,双数行从右到左打印,这就需要我们在求解过程中要记住当前打印的是单数行还是奇数行。

考虑设置两个辅助栈空间,分别用于存放单数行的数据和双数行的数据,根据层序遍历的思想:遍历某一行时,可以直接将下一行的内容缓存,由此得到处理流程思路:

                                     

对上面这个二叉树:

初始化1入单行栈,1出栈时,需要将1按照左节点进栈、右节点进展的顺序,将其子节点压入双行栈,这样后续双行栈出栈时,出栈顺序为从右到左。

双行栈出栈时,同样边出栈,边将子节点入单行栈,但是入栈顺序是:先入右节点,再入左节点,这样后续单行栈出栈时,出栈顺序为从左到右。

class Solution {
public:
    vector<vector<int> > Print(TreeNode* pRoot) {
        vector<vector<int>> res;
        if(pRoot == NULL)
            return res;
        stack<TreeNode*> s_single;//临时存放单层的数据
        stack<TreeNode*> s_double;//临时存放双层的数据
        //初始为1层
        int layer = 1; 
        s_single.push(pRoot);
        while(!s_single.empty() || !s_double.empty()){
            //双层
            if(layer%2 != 0){
                vector<int> v_single;
                while(!s_single.empty()){
                    TreeNode* tmp = s_single.top();
                    v_single.push_back(tmp->val);
                    s_single.pop();
                    if(tmp->left){
                        s_double.push(tmp->left);
                    }
                    if(tmp->right){
                        s_double.push(tmp->right);
                    }
                }
                res.push_back(v_single);
                layer++;
            }
            //单层
            else{
                vector<int> v_double;
                while(!s_double.empty()){
                    TreeNode* tmp = s_double.top();
                    v_double.push_back(tmp->val);
                    s_double.pop();
                    if(tmp->right){
                        s_single.push(tmp->right);
                    }
                    if(tmp->left){
                        s_single.push(tmp->left);
                    }
                }
                res.push_back(v_double);
                layer++;
            }
        }
        return res;
    }
};

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值