先序遍历的过程是:HLR(H:头,L:左孩子,R:右孩子)
递归算法:递归很简单;看代码
/**
- Definition for a binary tree node.
- struct TreeNode {
-
int val;
-
TreeNode *left;
-
TreeNode *right;
-
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
- };
/
class Solution {
public:
vector ans;
vector preorderTraversal(TreeNode root) {
if(root==NULL) return ans;
else{
ans.push_back(root->val);//对头结点访问
preorderTraversal(root->left);//左子树不空,递归的访问左子树
preorderTraversal( root->right);//右子树不空,递归的访问右子树
return ans;
}
return ans;
}
};
非递归算法:我们要借助栈来帮助实现。
/**
- Definition for a binary tree node.
- struct TreeNode {
-
int val;
-
TreeNode *left;
-
TreeNode *right;
-
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
- };
/
class Solution {
public:
vector ans;
stack<TreeNode> s;
vector preorderTraversal(TreeNode* root) {
if(root!=NULL){
s.push(root);//根节点入栈
while(!s.empty()){
TreeNode *p;
p=s.top();
s.pop();
ans.push_back(p->val);
/栈的特性是先进后出,所以这里由于遍历顺序是先左后右,所以入栈顺序
应该是先右后左/
if(p->right!=NULL) s.push(p->right);//右子树不空,入栈
if(p->left!=NULL) s.push(p->left);//左子树不空,入栈
}
return ans;
}
return ans;
}
};