前序遍历
给定一个二叉树,返回它的 前序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,2,3]
我的思路:
既然是前序遍历,那么就是根左右,我先访问当前节点的值并存入数组,然后再把右节点压栈,再把左节点压栈,这样先出栈的就是左节点,符合“根左右”。
代码:
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*> s;
vector<int> v;
TreeNode *cur = root;
if (root==NULL)
{
return v;
}
s.push(root);
while (!s.empty())
{
cur=s.top();
s.pop();
v.push_back(cur->val);
if (cur->right!=NULL)
{
s.push(cur->right);
}
if (cur->left!=NULL)
{
s.push(cur->left);
}
}
return v;
}
};
后序遍历
给定一个二叉树,返回它的 后序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [3,2,1]
我的思路:
其实这道题正常解法是非常困难的,就是按照后续遍历“左右根”的方式直接求解,而我这里取巧了,我只是在前面前序遍历的基础之上,稍稍修改取反即可,前序遍历“根左右”,后序遍历“左右根”,我反过来并将左右压栈顺序换一下即可。后面还有一个代码是头插法,其实原理就跟这个一样,但是感觉头插法效率低一些,因为要不断后移数组。
代码1:
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode*> s;
vector<int> v;
TreeNode *cur = root;
if (root==NULL)
{
return v;
}
s.push(root);
while (!s.empty())
{
cur=s.top();
s.pop();
v.push_back(cur->val);
if (cur->left!=NULL)
{
s.push(cur->left);
}
if (cur->right!=NULL)
{
s.push(cur->right);
}
}
reverse(v.begin(),v.end());
return v;
}
};
代码2:
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode*> s;
vector<int> v;
TreeNode *cur = root;
if (root==NULL)
{
return v;
}
s.push(root);
while (!s.empty())
{
cur=s.top();
s.pop();
v.insert(v.begin(),cur->val);
if (cur->left!=NULL)
{
s.push(cur->left);
}
if (cur->right!=NULL)
{
s.push(cur->right);
}
}
return v;
}
};