递归:
提交代码:
class Solution {
public:
vector<int> arr;
vector<int> preorderTraversal(TreeNode* root)
{
if(root!=NULL)
{
arr.push_back(root->val);
preorderTraversal(root->left);
preorderTraversal(root->right);
}
return arr;//在这里return而不是下面。
}
};
还是用C++好。有模板的好处。
非递归:
提交代码:
class Solution {
public:
vector<int> arr;
stack<TreeNode*> s;
vector<int> preorderTraversal(TreeNode* root)
{
TreeNode* p=root;
while(p!=NULL||s.empty()!=true)
{
while(p!=NULL)
{
s.push(p);
arr.push_back(p->val);
p=p->left;
}
if(s.empty()!=true)
{
p=s.top();
s.pop();
p=p->right;
}
}
return arr;
}
};
算法思路:
对于任一结点P:
1)访问结点P,并将结点P入栈;
2)判断结点P的左孩子是否为空,若为空,则取栈顶结点并进行出栈操作,并将栈顶结点的右孩子置为当前的结点P,循环至1);若不为空,则将P的左孩子置为当前的结点P;
3)直到P为NULL并且栈为空,则遍历结束。