前序遍历模板解法:
先将根节点cur和所有的左孩子节点入栈,并加入结果中,直到cur为空,用一个while循环实现,然后每弹出一个栈顶元素,就到达它的右孩子,再将这个节点当作cur,重复以上操作,直到栈为空。这里需要一个while循环。
/**
* 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> preorderTraversal(TreeNode* root) {
stack<TreeNode *> s;
vector<int> v;
TreeNode * cur = root;
while(cur != nullptr || !s.empty())
{
while(cur != nullptr)
{
s.push(cur);
v.emplace_back(cur->val);
cur = cur->left;
}
cur = s.top();
s.pop();
cur = cur->right;
}
return v;
}
};
中序遍历模板解法:
先将根节点cur和所有的左孩子节点入栈,直到cur为空,用一个while循环实现,然后每弹出一个栈顶元素,就将结果输出,然后到达它的右孩子,再将这个节点当作cur,重复以上操作,直到栈为空。这里需要一个while循环。
/**
* 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> preorderTraversal(TreeNode* root) {
stack<TreeNode *> s;
vector<int> v;
TreeNode * cur = root;
while(cur != nullptr || !s.empty())
{
while(cur != nullptr)
{
s.push(cur);
cur = cur->left;
}
cur = s.top();
s.pop();
v.emplace_back(cur->val);
cur = cur->right;
}
return v;
}
};
后序遍历解法:
继续按照上面的思想,这次我们反着思考,节点 cur 先到达最右端的叶子节点并将路径上的节点入栈;然后每次从栈中弹出一个元素后,cur 到达它的左孩子,并将左孩子看作 cur 继续执行上面的步骤。最后将结果反向输出即可。参考代码如下:
/**
* 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) {
stack<TreeNode *> s;
vector<int> v;
TreeNode * cur = root;
while(cur != nullptr || !s.empty())
{
while(cur != nullptr)
{
s.push(cur);
v.emplace_back(cur->val);
cur = cur->right;
}
cur = s.top();
s.pop();
cur = cur->left;
}
reverse(v.begin(),v.end());
return v;
}
};