Difficulty: Medium
Given a binary tree, return the preorder traversal of its nodes' values.
For example:
Given binary tree {1,#,2,3}
,
1 \ 2 / 3
return [1,2,3]
.
Note: Recursive solution is trivial, could you do it iteratively?
解法一:使用递归求解,判断当前根节点是否为空,先遍历当前子树的根节点,然后递归遍历当前节点的左子树,然后递归遍历当前节点的右子树。
/**
* 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<int> preorderTraversal(TreeNode* root) {
if(root)
{
v.push_back(root->val);
preorderTraversal(root->left);
preorderTraversal(root->right);
}
return v;
}
private:
vector<int> v;
};
一开始,我没有多想,一下子就把if那个条件判断写成了while,然后就TLE了,所以做题还是要想清楚每一步是怎么样的,不要想当然。
解法二:使用非递归的做法,先判断根节点是否为空,然后进行模拟先序访问,如果左子树非空,并且之前没有访问过,就访问左子树,然后访问右子树,也同样是要判断之前有没有访问过,每次访问将节点入栈,如果左子树和右子树都空,或者都访问过了,那么出栈。栈为空时访问结束。
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> v;
if(root==NULL)
return v;
else{
stack<TreeNode*> proc;
proc.push(root);
v.push_back(root->val);
map<TreeNode*,int> visit;
visit[root]=1;
while(!proc.empty())
{
TreeNode* node = proc.top();
if(node->left!=NULL && visit[node->left]!=1)
{
node=node->left;
visit[node]=1;
v.push_back(node->val);
proc.push(node);
}
else if(node->right!=NULL && visit[node->right]!=1)
{
node=node->right;
visit[node]=1;
v.push_back(node->val);
proc.push(node);
}
else{
proc.pop();
}
}
}
return v;
}
};