有穷状态自动机--一层循环迭代实现二叉树的前中后序遍历(对面试官降维打击)
Posted C_YCBX Py_YYDS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有穷状态自动机--一层循环迭代实现二叉树的前中后序遍历(对面试官降维打击)相关的知识,希望对你有一定的参考价值。
状态机过程详解
我们定义三个状态:
- LEFT状态:代表左右子树均未被遍历
- RIGHT状态:代表左子树被遍历
- UP状态:代表左右子树都被遍历过
注意还需要一个栈用于存储遍历路径,方便拿取父节点。
- 实现了这个迭代过程后,我们发现,实际上
LEFT状态
就是前序遍历的操作状态,RIGHT状态
就是中序遍历的操作状态,UP状态
就是后序遍历的操作状态,自此用迭代实现了递归的完全模拟!!!
画出状态转移图
(前序遍历代码)代码
//定义三种状态,
//LEFT状态代表左右子树均未被遍历
//RIGHT状态代表左子树被遍历
//UP状态代表左右子树都被遍历过
//用栈记录遍历路径
//那么实现前序只需要在LEFT状态下把结点加入答案即可
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;
}
};
以上是关于有穷状态自动机--一层循环迭代实现二叉树的前中后序遍历(对面试官降维打击)的主要内容,如果未能解决你的问题,请参考以下文章
蓝桥Java每日一练————6.二叉树的前中后序遍历(递归与迭代)
LeetCode JS实现 二叉树(前中后层序)遍历(递归迭代法)