144. Binary Tree Preorder Traversal
Description:
Given a binary tree, return the preorder traversal of its nodes’ values.
For example:
Given binary tree [1,null,2,3],
1
\
2
/
3
return [1,2,3].
Note: Recursive solution is trivial, could you do it iteratively?
先来一个递归的实现:
struct TreeNode{
int val;
TreeNode* left;
TreeNode* right;
};
//前序遍历
void preorder(TreeNode* root){
if(root){
cout<<root->val;
preorder(root->left);
preorder(root->right);
}
}
//中序遍历
void inorder(TreeNode* root){
if(root){
preorder(root->left);
cout<<root->val;
preorder(root->right);
}
}
//后序遍历
void inorder(TreeNode* root){
if(root){
preorder(root->left);
preorder(root->right);
cout<<root->val;
}
}
解法一:AC (beat 94.5%)
基本思想:利用栈的思想来实现二叉树的递归。
这种解法非教科书经典解法,但是这种解法能够很容易的适用于前、中、后序的遍历,只需调换顺序即可,而教科书经典解法中前中后序的实现之间有很大差别。
创建一个stack,来存放Command类型结构体。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
struct Command{
string s;
TreeNode* node;
Command(string s, TreeNode* node): s(s), node(node) {}
};
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root){
vector<int> res;
if(root == NULL)
return res;
stack<Command> stack;
stack.push(Command("go",root));
while(!stack.empty()){
Command command = stack.top();
stack.pop();
if(command.s == "print")
res.push_back(command.node->val);
else{
assert(command.s == "go");
//只需把下面不同的执行语句调换位置即可实现前中后序遍历
//前序遍历
if(command.node->right)
stack.push(Command("go",command.node->right));
if(command.node->left)
stack.push(Command("go",command.node->left));
stack.push(Command("print",command.node));
/*中序遍历
if(command.node->right)
stack.push(Command("go",command.node->right));
stack.push(Command("print",command.node));
if(command.node->left)
stack.push(Command("go",command.node->left));*/
/*后序遍历
stack.push(Command("print",command.node));
if(command.node->right)
stack.push(Command("go",command.node->right));
if(command.node->left)
stack.push(Command("go",command.node->left));*/
}
}
return res;
}
};