题目要求:返回树的前序遍历序列
前序遍历的过程:
(1)访问根节点
(2)前序遍历根节点的左子树
(3)前序遍历根节点的右子树
递归版本解法:
递归版本1:
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
preorder(root, res);
return res;
}
void preorder(TreeNode* root, vector<int>& res)
{
if(root == nullptr)
return;
res.push_back(root->val); //访问根节点
preorder(root->left, res); //前序遍历根节点的左子树
preorder(root->right, res); //前序遍历根节点的右子树
}
};
递归版本2:
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
if(root == nullptr)
return res;
res.push_back(root->val); //访问根节点
vector<int> leftPreorder = preorderTraversal(root->left); //前序遍历根节点的左子树
vector<int> rightPreorder = preorderTraversal(root->right); //前序遍历根节点的右子树
//合并
res.insert(res.end(), leftPreorder.begin(), leftPreorder.end());
//在res.end() 位置插入leftPreorder[begin, end)之间的所有元素
res.insert(res.end(), rightPreorder.begin(), rightPreorder.end());
return res;
}
};
非递归版本解法:
前序遍历可以分为两段,沿最左侧通路自顶而下访问各节点,以及自底而上遍历这些节点对应的右子树。
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
if(root == nullptr)
return res;
stack<TreeNode*> s;
TreeNode* cur = root;
s.push(cur);
while(!s.empty())
{
cur = s.top();
s.pop();
res.push_back(cur->val);
if(cur->right != nullptr) s.push(cur->right);
if(cur->left != nullptr) s.push(cur->left);
}
return res;
}
};