LeetCode:145. 二叉树的后序遍历(迭代和递归方法,C++带详细注释)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
// class Solution {//递归方法
// public:
// vector<int>res;//定义结果数组
// vector<int> postorderTraversal(TreeNode* root) {
// if(root==nullptr) return res;//树空直接返回
// postorderTraversal(root->left);//递归遍历左子树
// postorderTraversal(root->right);//递归遍历右子树
// res.push_back(root->val);//将节点值存入res
// return res;//返回res
// }
// };
class Solution {//迭代方法
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int>res;//定义结果数组
if(root==nullptr) return res;//树空直接返回
stack<TreeNode*>stk;//定义递归栈
TreeNode*pre=new TreeNode;//定义一变量指向右节点
while(root||!stk.empty())//节点非空或者栈非空循环
{
while(root)//节点非空循环
{
stk.push(root);//根节点入栈
pre=root->right;//pre指向右儿子
root=root->left;//向左节点进一步
if(root==nullptr) root=pre;//左节点空,则指向右节点
}
root=stk.top();//取出栈顶元素
res.push_back(root->val);//输出节点值
stk.pop();//删除栈顶元素
if(!stk.empty()&&stk.top()->left==root) //栈顶元素左子树是否为root
root=stk.top()->right;//是,开始处理右子树
else
root=nullptr;//否,开始输出根
}
return res;//返回结果值
}
};