栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

剑指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。

代码:
class Solution {
public:
    vector > Print(TreeNode* pRoot) {
        vector> result;
        if(pRoot == nullptr)
        {
            return result;
        }
        stack s;
        int count = 0;//0为奇数行,1为偶数行。
        s.push(pRoot);
        while(count == 1 || count == 0)
        {
            vector ret;
            queue 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;
    }

};
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/929053.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号