您的位置:首页 > 编程语言 > C语言/C++

leetcode_c++:栈: Binary Tree Postorder Traversal(145)

2016-07-22 15:45 429 查看
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].

递归

class Solution {
private:
void orderHelper(vector<int> &res, TreeNode *cur) {
if (!cur)
return;
if (cur->left)
orderHelper(res, cur->left);
if (cur->right)
orderHelper(res, cur->right);
res.push_back(cur->val);
}
public:
vector<int> postorderTraversal(TreeNode *root) {
vector<int> res;
orderHelper(res, root);
return res;
}
};


技巧

pre-order ,然后反转

vector<int> postorderTraversal1(TreeNode *root) {
vector<int> v;
vector<TreeNode*> stack;
if (root) {
stack.push_back(root);
}
while (stack.size()>0){
TreeNode *n = stack.back();
stack.pop_back();
v.push_back(n->val);
if (n->left){
stack.push_back(n->left);
}
if (n->right) {
stack.push_back(n->right);
}
}
std::reverse(v.begin(), v.end());  // the trick
return v;
}


迭代

// traditional and standard way.
// using the stack to simulate the recursive function stack.
vector<int> postorderTraversal2(TreeNode *root) {
vector<int> v;
vector<TreeNode*> stack;
TreeNode *node = root;
TreeNode *lastVisitNode = NULL;
while(stack.size()>0 || node!=NULL){

if (node != NULL){
// keep going the left
stack.push_back(node);
node = node->left;
}else{
TreeNode *n = stack.back();
// left way is finsised, keep going to the right way
if (n->right != NULL && lastVisitNode != n->right){
node = n->right;
}else{
// both left and right has been accessed.
stack.pop_back();
v.push_back(n->val);
lastVisitNode = n;
}
}
}
return v;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: