剑指offer之字形打印二叉树 C++

题目要求:

原题是牛客网剑指offer数据结构树的第二题。

  • 给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
  • 数据范围:0 \le n \le 15000≤n≤1500,树上每个节点的val满足 |val| <= 1500∣val∣<=1500
    要求:空间复杂度:O(n)O(n),时间复杂度:O(n)O(n)

解题思路:

  1. 可以把二叉树的图形结构分为奇偶两种层数,从根节点开始为第一层为奇,接下来是第二层为偶以此类推。在代码中用一个int变量Flag记录当前层数的奇偶,0为奇数行,1为偶数行。
  2. 需要用一个栈压入二叉树节点,一个队列保存一次循环从栈中弹出的所有二叉树结点。
  3. 当栈不为空时,将栈顶元素记录,并存储栈顶元素节点的val值在vector中,将此节点压入队列后弹出栈,直到栈中所有元素移入到队列。
  4. 当队列不为空时,则取出队首元素向栈中压入子树节点,若Flag为0当前为奇数行,下一行为偶数行,输出顺序为从右至左,在压入栈中时需要相反顺序压入。则向栈中压入队首元素的(不为空)左孩子与(不为空)右孩子(Flag为1则压入右孩子与左孩子)。至此一次大循环结束,当栈与队列同时为空时,说明已经遍历完二叉树则break。

代码:

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    vector<vector<int> > Print(TreeNode* pRoot) {
        vector<vector<int>> result;
        if(pRoot == nullptr)
        {
            return result;
        }
        stack<TreeNode*> s;
        int count = 0;//0为奇数行,1为偶数行。
        s.push(pRoot);
        while(count == 1 || count == 0)
        {
            vector<int> ret;
            queue<TreeNode*> arr;
            if(count == 1)//如果为偶数行
            {
                while(s.size() != 0)
                {
                TreeNode* temp1 = s.top();
                ret.push_back(temp1->val);
                arr.push(temp1);
                s.pop();
                }
                while(arr.size() != 0)
                {
                   TreeNode* temp1 = arr.front();
                    if(temp1->right != nullptr)
                    {
                    s.push(temp1->right);
                    }
                    if(temp1->left != nullptr)
                    {
                    s.push(temp1->left);
                    }
                    arr.pop();
                }
                result.push_back(ret);
                count = 0;
            }
            else if(count == 0)
            {
                while(s.size() != 0)
                {
                TreeNode* temp2 = s.top();
                ret.push_back(temp2->val);
                arr.push(temp2);
                s.pop();
                }
                 while(arr.size() != 0)
                {
                   TreeNode* temp2 = arr.front();
                     if(temp2->left != nullptr)
                     {
                    s.push(temp2->left);
                     }
                     if(temp2->right != nullptr)
                     {
                    s.push(temp2->right);
                     }
                    arr.pop();
                }
                result.push_back(ret);
                count = 1;
            }
            if(s.size() == 0 && arr.size() == 0)
            {
                break;
            }
        }
        return result;
    }

};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值