Binary Tree Preorder Traversal
Given a binary tree, return the preorder traversal of its nodes’ values.
For example:
Given binary tree{1,#,2,3},1 \ 2 / 3return
[1,2,3].Note: Recursive solution is trivial, could you do it iteratively?
tag: stack
不能再简单的题了,先序遍历。
即使说不让用递归,也可以很好的解出来。做此题时需要知道一个思想,递归的本质其实就是进程内存中维护着一个栈。这在计算机系统概论,也就是Patt上的那门课上,他着重解释过。所以如果不让我们用递归的话,那就加个栈吧!
为了比较速度,我把两种方法都贴上。应该是使用栈的方法更快。
版本一:使用递归
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> preorderTraversal(TreeNode *root) {
vector<int> re;
_preorderTraversal(re, root);
return re;
}
void _preorderTraversal(vector<int> &re, TreeNode *root){
if(root == NULL){
return;
}
re.push_back(root->val);
_preorderTraversal(re, root->left);
_preorderTraversal(re, root->right);
}
};
版本二:栈+循环
需要注意的是入栈顺序,应先把root->right入栈,再入root->left。因为先入栈的后处理。
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> preorderTraversal(TreeNode *root) {
vector<int> re;
TreeNode * p;;
stack<TreeNode *> s;
s.push(root);
while(!s.empty()){
p = s.top();
s.pop();
if(p == NULL){
continue;
}
re.push_back(p->val);
s.push(p->right);
s.push(p->left);
}
return re;
}
};
事实是,两个方法耗时都是3ms。可能是样例不够多,如果够多的话,肯定是不用递归的方法更快的。
因为递归调用时,CPU需要不断地把参数列表,返回地址,局部变量等都压入栈内,比较耗时。
