LeetCode刷题(19)【简单】二叉树的前&&中&&后遍历(非递归)(C++)

简介: LeetCode刷题(19)【简单】二叉树的前&&中&&后遍历(非递归)(C++)

精华在于进栈和出栈的时机

94.二叉树的中序遍历

题目

在这里插入图片描述

思路:
中序遍历的顺序是,左 - 根 - 右
创建一个栈来存储结点,创建一个vector来存储中序遍历的值
从根结点开始,只要该结点有左子树,就将该结点压进栈中。
直到root为空。
取出栈顶元素,栈顶元素出栈,将该结点值存进recv。
...
剩下的只可意会不可言传了,

感谢这位老哥分享——链接

class Solution {
public:
    //中序遍历顺序-左-中-右
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int>recv;
        stack<TreeNode*> Tstack;
       
       //当前结点不为空或当前栈不为空
       while(root || !Tstack.empty())
       {
           while(root)
           {
               //只要当前结点不为空就往栈里面压
               Tstack.push(root);
               root = root->left;
           }
           //此时栈顶元素为根节点左侧树最左的左子树
           //取到该结点
           root = Tstack.top();
           Tstack.pop();
           //pop出栈,存进recv中
           recv.push_back(root->val);
           root = root->right;
       }
        return recv;
    }
};

递归方法

144.二叉树的前序遍历

题目
在这里插入图片描述
非递归
感谢这位老哥分享——链接

class Solution {
public:
    
    vector<int> preorderTraversal(TreeNode* root) {
    vector<int>recv;
    stack<TreeNode*>Tstack;
    while(root || !Tstack.empty())
    {
        while(root)
        {
            recv.push_back(root->val);
            Tstack.push(root);
            root = root->left;
        }
        root = Tstack.top();
        Tstack.pop();
        root = root->right;
    }    
    return recv;
    }
};

145.二叉树的后序遍历

题目
在这里插入图片描述

一直往栈里面往左节点,压到左边最后一个做结点,往回pop,判断当前这个结点是否右结点,有右结点就输出,最后判断自己。

感谢这位老哥分享思路—链接

class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int>result;
        stack<TreeNode*>Tstack;
        TreeNode* cur = root;
        TreeNode* prev = nullptr;//记录cur上一个指向的结点,比cur走慢一步

        while(!Tstack.empty() || cur)
        {
            //只有cur不为空,就一直往里面压左节点
            while(cur) 
            {
                Tstack.push(cur);
                cur =cur->left;
            }
            cur = Tstack.top();
            //如果当前结点没有右结点 ||  右结点已经访问过了
            if(!cur->right || prev == cur->right)
            {
                Tstack.pop();
                result.push_back(cur->val);
                prev = cur;
                //要从栈里面往外面吐结点,所以要将cur置为null
                cur = nullptr;
            }   
            else
            {
                cur = cur->right;
            }
        }
        return   result;
    }
};

大致流程感觉
在这里插入图片描述在这里插入图片描述

相关文章
|
3月前
|
C++
基本二叉树与排序二叉树(C++源码)
本程序实现二叉树基本操作与二叉排序树应用。支持前序建树、四种遍历、求深度、叶子数、第K层节点数及查找功能;并实现二叉排序树的构建、中序输出与查找比较次数统计,分析不同插入顺序对树形态和查找效率的影响。
|
8月前
|
Go 开发者 索引
【LeetCode 热题100】路径与祖先:二叉树中的深度追踪技巧(力扣33 / 81/ 153/154)(Go语言版)
本文深入探讨了LeetCode中四道关于「搜索旋转排序数组」的经典题目,涵盖了无重复和有重复元素的情况。通过二分查找的变形应用,文章详细解析了每道题的解题思路和Go语言实现代码。关键点包括判断有序区间、处理重复元素以及如何缩小搜索范围。文章还总结了各题的异同,并推荐了类似题目,帮助读者全面掌握二分查找在旋转数组中的应用。无论是初学者还是有经验的开发者,都能从中获得实用的解题技巧和代码实现方法。
352 14
|
9月前
|
算法 Go
【LeetCode 热题100】深入理解二叉树结构变化与路径特性(力扣104 / 226 / 114 / 543)(Go语言版)
本博客深入探讨二叉树的深度计算、结构变换与路径分析,涵盖四道经典题目:104(最大深度)、226(翻转二叉树)、114(展开为链表)和543(二叉树直径)。通过递归与遍历策略(前序、后序等),解析每题的核心思路与实现方法。结合代码示例(Go语言),帮助读者掌握二叉树相关算法的精髓。下一讲将聚焦二叉树构造问题,欢迎持续关注!
254 10
|
9月前
|
存储 算法 数据可视化
【二叉树遍历入门:从中序遍历到层序与右视图】【LeetCode 热题100】94:二叉树的中序遍历、102:二叉树的层序遍历、199:二叉树的右视图(详细解析)(Go语言版)
本文详细解析了二叉树的三种经典遍历方式:中序遍历(94题)、层序遍历(102题)和右视图(199题)。通过递归与迭代实现中序遍历,深入理解深度优先搜索(DFS);借助队列完成层序遍历和右视图,掌握广度优先搜索(BFS)。文章对比DFS与BFS的思维方式,总结不同遍历的应用场景,为后续构造树结构奠定基础。
489 10
|
9月前
|
Go
【LeetCode 热题100】路径与祖先:二叉树中的深度追踪技巧(力扣437 / 236 )(Go语言版)
本文深入探讨二叉树中路径与祖先问题,涵盖两道经典题目:LeetCode 437(路径总和 III)和236(最近公共祖先)。对于路径总和 III,文章分析了双递归暴力解法与前缀和优化方法,后者通过哈希表记录路径和,将时间复杂度从O(n²)降至O(n)。在最近公共祖先问题中,采用后序遍历递归查找,利用“自底向上”的思路确定最近公共祖先节点。文中详细解析代码实现与核心要点,帮助读者掌握深度追踪技巧,理解树结构中路径与节点关系的本质。这类问题在面试中高频出现,掌握其解法意义重大。
235 4
|
9月前
|
Go 索引 Perl
【LeetCode 热题100】【二叉树构造题精讲:前序 + 中序建树 & 有序数组构造 BST】(详细解析)(Go语言版)
本文详细解析了二叉树构造的两类经典问题:通过前序与中序遍历重建二叉树(LeetCode 105),以及将有序数组转化为平衡二叉搜索树(BST,LeetCode 108)。文章从核心思路、递归解法到实现细节逐一拆解,强调通过索引控制子树范围以优化性能,并对比两题的不同构造逻辑。最后总结通用构造套路,提供进阶思考方向,帮助彻底掌握二叉树构造类题目。
598 9
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
395 12
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
212 10
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
586 3
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
386 1