有穷状态自动机--一层循环迭代实现二叉树的前中后序遍历(对面试官降维打击)

Posted C_YCBX Py_YYDS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有穷状态自动机--一层循环迭代实现二叉树的前中后序遍历(对面试官降维打击)相关的知识,希望对你有一定的参考价值。

状态机过程详解

我们定义三个状态:

  1. LEFT状态:代表左右子树均未被遍历
  2. RIGHT状态:代表左子树被遍历
  3. UP状态:代表左右子树都被遍历过

注意还需要一个栈用于存储遍历路径,方便拿取父节点。

  • 实现了这个迭代过程后,我们发现,实际上LEFT状态就是前序遍历的操作状态,RIGHT状态就是中序遍历的操作状态,UP状态就是后序遍历的操作状态,自此用迭代实现了递归的完全模拟!!!

画出状态转移图
image.png

(前序遍历代码)代码

 //定义三种状态,
 //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实现 二叉树(前中后层序)遍历(递归迭代法)

LeetCode JS实现 二叉树(前中后层序)遍历(递归迭代法)

二叉树的前中后序遍历全世界