解法一:先序序列分为两段:沿最左侧通路自上而下访问的各顶点(以v表示),以及自底向上遍历的右子树(存储于s之中)
class Solution
{
public:
void visitAlongLeftBranch(TreeNode* root,vector<int>& v,stack<TreeNode*>& s)
{
while(root)
{
v.push_back(root->val);
if(root->right) s.push(root->right);
if(root->left) root=root->left;
}
}
vector<int> preorderTraversal(TreeNode* root)
{
vector<int> v;
if(root==nullptr) return v;
stack<TreeNode*> s;
while(true)
{
visitAlongLeftBranch(root,v,s);
if(s.empty()) break;
root=s.top();
s.pop();
}
return v;
}
};
解法二:通过递归版本转化而来的
class Solution
{
public:
vector<int> preorderTraversal(TreeNode* root)
{
vector<int> v;
if(root==nullptr) return v;
stack<TreeNode*> s;
s.push(root);
while(!s.empty())
{
TreeNode* temp=s.top();
v.push_back(temp->val);
s.pop();
if(temp->right) s.push(temp->right);
if(temp->left) s.push(temp->left);
}
return v;
}
};