LeetCode刷题(19)【简单】二叉树的前&&中&&后遍历(非递归)(C++)
2023-09-27 14:25:56 时间
@TOC
精华在于进栈和出栈的时机
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; };
大致流程感觉
相关文章
- C++ 定位文件 .text 区段地址
- C++设计模式之状态模式(二)
- C++中 *&(指针引用)与*(指针)的区别
- C++在堆上申请和释放内存 - new & delete
- C++11的enum class & enum struct和enum
- 《C++ AMP:用Visual C++加速大规模并行计算》——1.3 C++ AMP方法
- 《C++ AMP:用Visual C++加速大规模并行计算》——3.1 array < T,N >
- 《C++ AMP:用Visual C++加速大规模并行计算》——3.5 array_view< T,N >
- 《C++ AMP:用Visual C++加速大规模并行计算》——3.6 parallel_for_each
- 《C++ AMP:用Visual C++加速大规模并行计算》——3.10 小结
- 《C++编程调试秘笈》——第2章 什么时候捕捉缺陷2.1 为什么编译器是捕捉缺陷的最好场合
- 《Imperfect C++中文版》——2.3 MIL及其优点
- 编译c/c++完整工具链
- C++进阶之虚函数表
- 蓝桥杯历年真题——第十二届C&C++研究生组
- 81、【栈与队列】leetcode ——232. 用栈实现队列(C++版本)
- 68、【哈希表】leetcode——349. 两个数组的交集(C++版本)
- 60、【数组】leetcode——209. 长度最小的子数组-滑动窗口:最小窗口(C++、Python版本)
- 【C++】atoi与stoi