二叉树的前序遍历主要有两种方法实现:
1.递归实现:
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> ans;
preorder(ans,root);
return ans;
}
void preorder(vector<int>& ans,TreeNode* root){
if(root==NULL)
return;
ans.push_back(root->val);
preorder(ans,root->left);
preorder(ans,root->right);
}
};
2.非递归实现:
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> ans;
if(root==NULL)
return ans;
preorder(ans,root);
return ans;
}
void preorder(vector<int>& ans,TreeNode* root){
stack<TreeNode*> s;
while(!s.empty() || root!=NULL){
while(root!=NULL){
ans.push_back(root->val);
s.push(root);
root = root->left;
}
if(!s.empty()){
root = s.top();
s.pop();
root = root->right;
}
}
}
};
简单说一下思路:当根节点不为空时,访问根节点,并入栈;若根节点的左子树不为空,则将左结点置为根节点;若为空,则取栈顶元素,并将栈顶元素的右节点置为根节点,一直到栈为空并且root为空。