算法进阶——按之字形顺序打印二叉树

这篇具有很好参考价值的文章主要介绍了算法进阶——按之字形顺序打印二叉树。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目


给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)。

数据范围:0≤n≤1500,树上每个节点的val满足∣val∣<=1500

要求:空间复杂度:O(n),时间复杂度:O(n)

例如:
给定的二叉树是{1,2,3,#,#,4,5}

算法进阶——按之字形顺序打印二叉树,算法,算法

该二叉树之字形层序遍历的结果是
[
[1],
[3,2],
[4,5]
]

示例1

输入:
{1,2,3,#,#,4,5}
返回值:
[[1],[3,2],[4,5]]
说明:
如题面解释,第一层是根节点,从左到右打印结果,第二层从右到左,第三层从左到右。

示例2

输入:
{8,6,10,5,7,9,11}
返回值:
[[8],[10,6],[5,7,9,11]]

示例3

输入:
{1,2,3,4,5}
返回值:
[[1],[3,2],[4,5]]

思路


用两个辅助栈,通过层序遍历二叉树,需要注意的是因为奇数层要从左往右打印,所以前一个偶数层入栈需要先右后左,偶数层正好相反。

总结规律就是奇数层先左后右入栈,偶数层先右后左入栈。文章来源地址https://www.toymoban.com/news/detail-810399.html

解答代码


/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
#include <stack>
#include <vector>
class Solution {
public:
    /**
     * @param pRoot TreeNode类 
     * @return int整型vector<vector<>>
     */
    vector<vector<int> > Print(TreeNode* pRoot) {
        // write code here
        vector<vector<int> > res{};
        if (pRoot == nullptr) {
            return res;
        }

        stack<TreeNode*> odd_level;// 奇数层,从左往右打印
        stack<TreeNode*> even_level;// 偶数层,从右往左打印
        int cur = 1;// 当前层索引
        odd_level.push(pRoot);

        vector<int> tmp;
        while (!odd_level.empty() || !even_level.empty()) {
            if ((cur&1) == 1) {
                // 奇数层
                auto size = odd_level.size();
                for (int i = 0; i < size; i++) {
                    auto node = odd_level.top();
                    tmp.push_back(node->val);

                    // 先左后右
                    if (node->left != nullptr) {
                        even_level.push(node->left);
                    }
                    if (node->right != nullptr) {
                        even_level.push(node->right);
                    }

                    odd_level.pop();
                }
            } else {
                // 偶数层
                auto size = even_level.size();
                for (int i = 0; i < size; i++) {
                    auto node = even_level.top();
                    tmp.push_back(node->val);

                    // 先右后左
                    if (node->right != nullptr) {
                        odd_level.push(node->right);
                    }
                    if (node->left != nullptr) {
                        odd_level.push(node->left);
                    }

                    even_level.pop();
                }
            }
            ++cur;
            res.push_back(tmp);
            tmp.clear();
        }

        return res;
    }
};

到了这里,关于算法进阶——按之字形顺序打印二叉树的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构<树和二叉树>顺序表存储二叉树实现堆排

    ✨Blog:🥰不会敲代码的小张:)🥰 🉑推荐专栏: C语言 🤪、 Cpp 😶‍🌫️、 数据结构初阶 💀 💽座右铭:“ 記住,每一天都是一個新的開始😁😁😁 ” 💀本章内容: 《树和二叉树》的介绍✨ 树是一种非线性的数据结构,它是由n(n=0)个有限结点组成一个具有层次关系

    2024年02月12日
    浏览(46)
  • 【数据结构】二叉树——顺序结构

    由于每个节点都 只有一个父节点 ,所以我们可通过双亲来表示一棵树。具体方式通过 数组的形式 实现。 根节点的下标为0 按照层序从上到下排序 每层从左向右递增 表示形式: 二维数组 数据的列标为0 ,只需确定行标,即可锁定位置 根节点的父节点下标为 -1 列标为1存父节

    2024年02月02日
    浏览(56)
  • 在二叉树中查找值为 x的结点,试编写算法(用 C语言)打印值为 X 的结点的所有祖先,假设值为x的结点不多于一个。

    分析: 两种思路,递归和非递归。 思路: 考虑递归,当前结点值不等于 x 时,递归其左右子树,如果两者有一个返回值为 true,则说明当前结点为 x 的祖先结点,直接打印。 思路: 非递归,因为在遇到 x 的时候需要将其所有祖先打印,而当访问到 x 且能保留x 的祖先的方法

    2024年02月03日
    浏览(40)
  • 数据结构——顺序二叉树——堆

            在介绍二叉树之前,我们首先要明确树是什么。         树 用我们的通常认识来判断应该是一种植物,从根向上生长,分出许多的树枝并长出叶子。对于数据结构中的树而言,其结构也正是从树的特征中剥离出来的。树结构是一种非线性数据结构,具有一个根结

    2024年01月19日
    浏览(39)
  • 【数据结构】树、二叉树的概念和二叉树的顺序结构及实现

    之前我们学习了顺序表、链表以及栈和队列这些数据结构,但这些数据结构都是线性的(一对一)。接下来要学习 非线性的数据结构——树(二叉树) ,相比前面的,树的结构更加复杂,话不多说,直接进入正题吧。 树是一种 非线性的数据结构 ,它是 一对多(也有可能是

    2024年02月07日
    浏览(42)
  • 【树与二叉树】二叉树顺序结构实现以及堆的概念及结构--详解介绍

    ​ ​📝个人主页:@Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:数据结构 🎯 长路漫漫浩浩,万事皆有期待 普通二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而 完全二叉树适合使用顺序结构存储 。现实中我们通常把 堆

    2023年04月24日
    浏览(42)
  • 二叉树进阶(搜索二叉树)

    目录 引言  1.二叉搜索树的模拟实现 1.1  链式二叉树的定义 1.2 二叉搜索树的模拟实现  1.2.1 二叉搜索树的结点类 1.2.2 二叉搜索树类的构造与中序遍历实现 1.2.3 增 1.非递归实现 2.非递归实现 1.2.4 查 1.非递归实现 2.递归实现  1.2.5 删 1.非递归实现 (1)情况分析 (2)解决方案  (

    2024年02月15日
    浏览(286)
  • 常见的数据结构(顺序表、顺序表、链表、栈、队列、二叉树)

    线性表(Linear List)     1.什么是线性表     2.线性表的特点     3.线性表的基本运算 顺序表     1.什么是顺序表     2.时间复杂度: 链表     1.什么是链表     2.单向链表     3. 双向链表     4.ArrayList和LinkedList的使用 栈Stack     1.什么是栈     2.栈的基本方法 队列Queue

    2024年02月13日
    浏览(38)
  • 数据结构-二叉树·堆(顺序结构的实现)

    🎉个人名片: 🐼作者简介:一名乐于分享在学习道路上收获的大二在校生 🐻‍❄个人主页🎉:GOTXX 🐼个人WeChat : ILXOXVJE 🐼本文由GOTXX原创,首发CSDN🎉🎉🎉 🕊系列专栏:零基础学习C语言----- 数据结构的学习之路 🐓每日一句:如果没有特别幸运,那就请特别努力!🎉

    2024年02月05日
    浏览(47)
  • 二叉树的顺序存储及基本操作

    1、在树中除根结点外,其余结点分成m(m≥0)个(A)的集合T1,T2,T3…Tm,每个集合又都是树,此时结点T称为Ti的父结点,Ti称为T的子结点(1≤i≤m)。 A、互不相交B、可以相交C、叶节点可以相交D、树枝结点可以相交 2、在一棵度为3的树中,度为3的结点数为2个,度为2的结点

    2024年02月06日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包