Description
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]
Follow Up
Recursive solution is trivial, could you do it iteratively?
Solution 1(C++)
class Solution{
public:
void preorder(TreeNode* node, vector<int>& res){
if(!node) return;
res.push_back(node->val);
preorder(node->left, res);
preorder(node->right, res);
}
vector<int> preorderTraversal(TreeNode* root){
vector<int> res;
preorder(root, res);
return res;
}
}
Solution 2(C++)
class Solution{
public:
vector<int> preorderTraversal(TreeNode* root){
vector<int> res;
stack<TreeNode*> visit;
while(root||!visit.empty()){
if(root){
res.push_back(root->val);
visit.push(root);
root=root->left;
}
else{
root=visit.top();
visit.pop();
root=root->right;
}
}
return res;
}
}
Solution 3(C++)
class Solution{
public:
vector<int> preorderTraversal(TreeNode* root){
vector<int> res;
stack<TreeNode*> visit;
if(root==nullptr) return {};
else visit.push(root);
while(!visit.empty()){
TreeNode* node=visit.top();
visit.pop();
res.push_back(node->val);
if(node->right)
visit.push(node->right);
if(node->left)
visit.push(node->left);
}
return res;
}
}
后续更新
二叉树的中序遍历可参考:
算法分析
这道题是二叉树的前序遍历。递归方法与中序遍历没有两样。按照定义来即可。
解法二与解法三均是迭代版本,但是两者有细微差别。对于前序遍历,个人认为解法三理解起来更加容易,解法二是参考中序遍历中的解法三变化而来的。本体解法三设定栈其实是按照前序遍历的顺序储存的二叉树节点。而且栈中没有空节点。栈最上层是要遍历的节点,次一层是下一次遍历的节点。所以,迭代算法描述如下:
- 取栈最上层,将对应节点元素放入res中;并将该节点移出栈;
- 判断该节点右子节点是否为空,若不为空,则放入栈;
- 判断该节点左子节点是否为空,若不为空,则放入栈;
- 当栈不为空时,重复上述过程。
注意这里,前序遍历顺序是:根-左-右,这里入栈是先放右,再放左,先进后出嘛。
程序分析
略