二叉树的后序遍历。
两个栈方式的
直接看http://www.bilibili.com/video/av23885544/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
class Solution { public: vector<int> postorderTraversal(TreeNode* root) { vector<int> ans; if (!root) { return ans; } stack<TreeNode*> nodes; stack<bool> tag; nodes.push(root); tag.push(false); TreeNode* p = root->left; while (p || !nodes.empty()) { if (p) { nodes.push(p); tag.push(false); p = p->left; } else { if (tag.top()) { tag.pop(); auto a = nodes.top(); ans.push_back(a->val); nodes.pop(); } else { tag.pop(); tag.push(true); p = nodes.top()->right; } } } return ans; } };
|
前序遍历改一下
前序遍历的时候,把左右子树进栈的顺序反一下,得到的结果就是后序遍历的反向。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Solution { public: vector<int> postorderTraversal(TreeNode* root) { vector<int> ans; if (!root) { return ans; } stack<TreeNode*> nodes; nodes.push(root); while (!nodes.empty()) { auto a = nodes.top(); nodes.pop(); if (a) { ans.insert(ans.begin(), a->val); nodes.push(a->left); nodes.push(a->right); } } return ans; } };
|