1.递归方法
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> pre;
vector<int> left;
vector<int> right;
if (root != NULL) {
pre.push_back(root->val);
left=preorderTraversal(root->left);
right=preorderTraversal(root->right);
pre.insert(pre.end(), left.begin(), left.end());
pre.insert(pre.end(), right.begin(), right.end());
}
return pre;
}
};
2.利用栈
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> resStack;
if (root == NULL)return res;
resStack.push(root);
while (!resStack.empty()) {
TreeNode* node = resStack.top();
resStack.pop();
res.push_back(node->val);
if (node->right != NULL) {
resStack.push(node->right);
}
if (node->left != NULL) {
resStack.push(node->left);
}
}
return res;
}
};
3.利用栈(不破坏顺序)
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> resStack;
set<TreeNode*> visited;
if (root == NULL)return res;
resStack.push(root);
TreeNode* node;
while (!resStack.empty()) {
node = resStack.top();
//若该节点没有被访问,访问并标记
if (visited.find(node) == visited.end()) {
res.push_back(node->val);
visited.insert(node);
}
//若左孩子存在且没有访问过
while (node->left != NULL&&visited.find(node->left)==visited.end()) {
resStack.push(node->left);
res.push_back(node->left->val);
visited.insert(node->left);
node = node->left;
}
//若右孩子存在且没有访问过,访问并标记,否则弹出该节点
if (node->right != NULL&& visited.find(node->right) == visited.end()) {
resStack.push(node->right);
res.push_back(node->right->val);
visited.insert(node->right);
node = node->right;
}
else {
resStack.pop();
}
}
return res;
}
};