二叉树的后序遍历 binary-tree-postorder-traversal
题目描述
求给定的二叉树的后序遍历。
例如:
给定的二叉树为{1,#,2,3},
1↵ ↵ 2↵ /↵ 3↵
返回[3,2,1].
备注;用递归来解这道题太没有新意了,可以给出迭代的解法么?
Given a binary tree, return the postorder traversal of its nodes’ values.
For example:
Given binary tree{1,#,2,3},
1↵ ↵ 2↵ /↵ 3↵
return[3,2,1].
Note: Recursive solution is trivial, could you do it iteratively?
解题思路
思路1:递归
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
if(root == NULL) return res;
postorder(root, res);
return res;
}
void postorder(TreeNode* root, vector<int>& res) {
if(root == NULL) return ;
postorder(root -> left, res);
postorder(root -> right, res);
res.push_back(root -> val);
}
};
思路2:迭代
-
利用前序遍历的迭代解法,前序遍历得到的是中-左-右,将其变为中-右-左(入栈顺序变一下即可,左子树先入栈),然后将结果reverse一下得到左-右-中,即为后序遍历。
-
翻转res数组:
reverse(res.begin(), res.end());
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
if(root == NULL) return res;
stack<TreeNode*> mystack;
mystack.push(root);
while(!mystack.empty()) {
TreeNode* temp = mystack.top();
mystack.pop();
res.push_back(temp -> val);
//更换入栈次序,先左再右
if(temp -> left) mystack.push(temp -> left);
if(temp -> right) mystack.push(temp -> right);
}
reverse(res.begin(), res.end());
return res;
}
};