递归后序遍历
/**
* 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> postorderTraversal(TreeNode* root) {
vector<int>vec;
postorder(root,vec);
return vec;
}
void postorder(TreeNode* &root,vector<int> &vec){
if(root==nullptr)return;
postorder(root->left,vec);
postorder(root->right,vec);
vec.push_back(root->val);
}
};
非递归后序遍历:
思路:
使用两个栈实现
1、申请两个栈,一个记为stk1 ,另外一个即为stk2,然后将头节点压入stk1中。
2、从stk1中弹出的节点记为node,然后先把node的左孩子压入stk1中,然后把cur1的右孩子压入stk1中。
3、在整个过程中,每一个从stk1中弹出的节点都放进第二个栈stk2中。
4、不断重复步骤2和步骤3,直到stk1为空,过程停止。
5、然后让stk2中元素出栈,出栈顺序即为后序遍历
代码:
/**
* 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> postorderTraversal(TreeNode* root) {
if(root==nullptr)return{};
vector<int>vec;
stack<TreeNode*>stk1;
stack<TreeNode*>stk2;
stk1.push(root);
while(!stk1.empty()){
TreeNode *node=stk1.top();
stk1.pop();
stk2.push(node);
if(node->left) stk1.push(node->left);
if(node->right) stk1.push(node->right);
}
while(!stk2.empty()){
TreeNode* cur= stk2.top();
stk2.pop();
vec.push_back(cur->val);
}
return vec;
}
};
时间复杂度均为:O(n)
空间复杂度均为:O(n)