LeetCode 145. Binary Tree Postorder Traversal 二叉树的后序遍历 C++
Given a binary tree, return the postorder traversal of its nodes' values.
Example:
Input: [,null,,]
    \
    /
Output: [,,]
Follow up: Recursive solution is trivial, could you do it iteratively?
方法一:利用两个栈s1,s2来实现,先将头结点入栈s1,从s1弹出栈顶节点记为cur,压入s2中,分别将cur的左右孩子压入s1,当s1为空后,s2的弹出节点次序就是后序遍历的次序。(C++)
 vector<int> postorderTraversal(TreeNode* root) {
         stack<TreeNode*> s1,s2;
         s1.push(root);
         vector<int> res={};
         if(!root)
             return res;
         TreeNode* cur;
         while(!s1.empty()){
             cur=s1.top();
             s1.pop();
             s2.push(cur);
             if(cur->left)
                 s1.push(cur->left);
             if(cur->right)
                 s1.push(cur->right);
         }
         while(!s2.empty()){
             cur=s2.top();
             s2.pop();
             res.push_back(cur->val);
         }
         return res;
     }
方法二:先将头结点压入栈,怎样判断是该结点是应该输入vector中还是应该处理他的孩子?
1.该节点左右孩子为空时,为叶子结点,则该次遍历是输入到vector中
2.上一次输入的结点为该节点右孩子时,说明该结点的子树处理完毕,这次遍历是输入vector中
3.如果上一次输入的结点为该节点的左孩子,且右孩子为空,则该结点处理完毕,这次遍历就是输入vector中
4.否则说明子树没有被访问,按右、左孩子入栈。(C++)
 vector<int> postorderTraversal(TreeNode* root) {
         stack<TreeNode*> s;
         vector<int> res={};
         if(!root)
             return res;
         s.push(root);
         TreeNode* last=NULL;
         TreeNode* top;
         while(!s.empty()){
             top=s.top();
             if((top->left==NULL&&top->right==NULL)||(top->right==NULL&&last==top->left)||(last==top->right&&last!=NULL)){
                 res.push_back(top->val);
                 last=top;
                 s.pop();
             }
             else{
                 if(top->right)
                     s.push(top->right);
                 if(top->left)
                     s.push(top->left);
             }
         }
         return res;
     }
注意此时要加上这个判定条件,若不加,输出的为2,1,没有把3这个结点入栈
方法三:递归方法(C++)
 void postOrder(TreeNode* root,vector<int> &res){
         if(!root)
             return;
         postOrder(root->left,res);
         postOrder(root->right,res);
         res.push_back(root->val);
     }
     vector<int> postorderTraversal(TreeNode* root) {
         vector<int> res={};
         if(!root)
             return res;
         postOrder(root,res);
         return res;
     }
LeetCode 145. Binary Tree Postorder Traversal 二叉树的后序遍历 C++的更多相关文章
- C++版 - LeetCode 145: Binary Tree Postorder Traversal(二叉树的后序遍历,迭代法)
		
145. Binary Tree Postorder Traversal Total Submissions: 271797 Difficulty: Hard 提交网址: https://leetco ...
 - [LeetCode] 145. Binary Tree Postorder Traversal 二叉树的后序遍历
		
Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary ...
 - LeetCode 145. Binary Tree Postorder Traversal二叉树的后序遍历 (C++)
		
题目: Given a binary tree, return the postorder traversal of its nodes' values. Example: Input: [1,nul ...
 - 【LeetCode】Binary Tree Postorder Traversal(二叉树的后序遍历)
		
这道题是LeetCode里的第145道题. 题目要求: 给定一个二叉树,返回它的 后序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [3,2,1] 进阶: 递归算法很 ...
 - leetcode题解:Binary Tree Postorder Traversal (二叉树的后序遍历)
		
题目: Given a binary tree, return the postorder traversal of its nodes' values. For example:Given bina ...
 - 145 Binary Tree Postorder Traversal 二叉树的后序遍历
		
给定一棵二叉树,返回其节点值的后序遍历.例如:给定二叉树 [1,null,2,3], 1 \ 2 / 3返回 [3,2,1].注意: 递归方法很简单,你可以使用迭代方法来解 ...
 - [LeetCode] Binary Tree Postorder Traversal 二叉树的后序遍历
		
Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary ...
 - lintcode:Binary Tree Postorder Traversal 二叉树的后序遍历
		
题目: 二叉树的后序遍历 给出一棵二叉树,返回其节点值的后序遍历. 样例 给出一棵二叉树 {1,#,2,3}, 1 \ 2 / 3 返回 [3,2,1] 挑战 你能使用非递归实现么? 解题: 递归程序 ...
 - Leetcode145. Binary Tree Postorder Traversal二叉树的后序遍历
		
给定一个二叉树,返回它的 后序 遍历. 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 递归: class Solution { public: vector<int> res; ve ...
 
随机推荐
- Web前端学习第三天(cookie 二)
			
HttpOniy Cookie机制 在http层面传输cookie,当设置HttpOnly标志后,客户端脚本就无法读写该cookie.可以用此防止xss攻击获取cookie <?php setc ...
 - jupyter notebook 目录配置、导出 tex 和 pdf 及中文支持
			
环境:macbook pro, mactex, jupyter notebook, brew 安装pandoc从而支持格式转换为tex: brew install pandoc 修改tex artic ...
 - 【Jest】笔记一:环境配置
			
一.开发环境 Mac node.js:v9.9.0 下载链接:http://nodejs.cn/download/ VScode 下载链接:https://code.visualstudio.com ...
 - django-枚举类型扩展方法
			
原文地址:https://docs.djangoproject.com/en/dev/ref/models/instances/#django.db.models.Model.get_FOO_disp ...
 - remove-weknow-ac from mac chrome
			
refer:https://macreports.com/how-to-remove-weknow-ac-malware-macos/ 1-Remove the weknow.ac profile. ...
 - MySQL Execution Plan--IN子查询包含超多值引发的查询异常1
			
======================================================================= SQL语句: SELECT wave_no, SUM(I ...
 - click python cli 开发包
			
python click 包是一个方便的cli 开发包,我们可以用来开发强大的cli 应用 使用venv 进行环境准备,示例代码来自官方 venv 环境准备 python3 -m venv demoa ...
 - magento 1.9 上传后图片前后台无法正常显示
			
1.上传后图片不显示,设置 允许 flash 2.保证php 执行是内存大小至少为为128M,多种方式设置,这里以init_set为例子,在index.php 加入下面一行代码,根据情况而定 ini_ ...
 - Linux  ①
			
目录 一.计算机简单认识 二.linux初始 三.安装虚拟机 四.安装Linux系统 五. 使用xshell 6 进行远程控制 六.linux文档与目录结构 七.常用命令 一.计算机简单认识 1.服务 ...
 - 代理设计模式在auto_ptr及smart_ptr中的体现
			
下面这段代码是auto_ptr的实现: class Image { public: Image(string name): m_imageName(name) {} virtual ~Image() ...