Given a binary tree, return the preorder traversal of its nodes' values.
Example:
Input:[1,null,2,3]
1 \ 2 / 3 Output:[1,2,3]
思路:
二叉树的前序遍历,根据其定义编程即可:先访问跟,然后左子节点和右子节点。
但是在具体的编程实现上可以有两种方式:
1 通过递归的方式
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
if (root != NULL) {
res.push_back(root->val);
}
else return res;
vector<int> left = preorderTraversal(root->left);
vector<int> right = preorderTraversal(root->right);
if(left.size() > 0) res.insert(res.end(), left.begin(), left.end());
if (right.size() > 0) res.insert(res.end(), right.begin(), right.end());
return res;
}
2 通过暂存右节点的方式
vector<int> preorderTraversal2(TreeNode* root) {
vector<int> res;
vector<TreeNode*> s;
TreeNode* tmp = root;
while (!s.empty() || tmp) {
while (tmp) {
res.push_back(tmp->val);
s.push_back(tmp->right);
tmp = tmp->left;
}
tmp = s.back();
s.pop_back();
}
return res;
}
从时间复杂度来看,两种遍历方式是没有太大差别的,都是O(n)的时间复杂度;但是递归的方式消耗的内存多一些,这是因为操作系统在为我们调用递归函数时有额外的一些开销。