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需要不断地把参数列表,返回地址,局部变量等都压入栈内,比较耗时。