简单遍历
class Solution {
public:
void qian(TreeNode* root,vector<int> &v)
{
if(!root)return ;
v.push_back(root->val);
qian(root->left,v);
qian(root->right,v);
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> v;
qian(root,v);
return v;
}
};
递归版本只以前序遍历为例,下面所述遍历均为迭代算法
前序遍历
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> v;
stack<TreeNode*> s;
while(!s.empty()||root)
{
while(root)//root单兵疯狂向左突破,每次小突破前先搞个人质
{
v.push_back(root->val);//搞人质
s.push(root);
root=root->left;//突破
}
root=s.top();s.pop();//复活
root=root->right;
}
return v;
}
};
中序遍历
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> ans;
stack<TreeNode*> s;
while(!s.empty()||root)
{
while(root)//root单兵疯狂向左突破
{
s.push(root);
root=root->left;
}
root=s.top();s.pop(); //复活
ans.push_back(root->val);//大突破完再拉人质
root=root->right;//向右突破
}
return ans;
}
};
后序遍历
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> v;
stack<TreeNode*> s;
TreeNode* t=nullptr;
while(root||!s.empty())
{
while(root)//先向左突破
{
s.push(root);
root=root->left;
}
root=s.top();s.pop();//复活
if(!root->right||root->right==t)//右边没人或上次打过了
{
v.push_back(root->val);//人质
t=root;//给打过的人一个标记
root=nullptr;//将目标置空,等待下次从栈中获取敌人
}
else//右边有新敌人,向右小突一次
{
s.push(root);
root=root->right;
}
}
return v;
}
};