状态机过程详解
我们定义三个状态:
- LEFT状态:代表左右子树均未被遍历
- RIGHT状态:代表左子树被遍历
- UP状态:代表左右子树都被遍历过
注意还需要一个栈用于存储遍历路径,方便拿取父节点。
- 实现了这个迭代过程后,我们发现,实际上
LEFT状态 就是前序遍历的操作状态,RIGHT状态 就是中序遍历的操作状态,UP状态 就是后序遍历的操作状态,自此用迭代实现了递归的完全模拟!!!
画出状态转移图
(前序遍历代码)代码
class Solution {
const int LEFT = 1;
const int RIGHT = 2;
const int UP = 3;
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int>res;
vector<TreeNode*>path;
int state = LEFT;
while(root){
if(state == LEFT){
res.emplace_back(root->val);
if(root->left){
path.emplace_back(root);
root = root->left;
}else
state = RIGHT;
}
else if(state == RIGHT){
if(root->right){
state = LEFT;
path.emplace_back(root);
root = root->right;
}
else state = UP;
}else if(state == UP){
TreeNode* p = nullptr;
if(!path.empty()){
p = path.back();path.pop_back();
if(root==p->left){
state = RIGHT;
}
}
root = p;
}
}
return res;
}
};
|