BinaryTree,Preordertraversal,Inordertraversal,and Postordertraversal的三种非递归实现方式

二叉树遍历的三种非递归实现方式

       二叉树的前序遍历,中序遍历,后续遍历是三种十分基础的便利方式,大多数人对其三种递归方式的遍历比较熟悉。这篇文章主要针对LeetCode上面的题目,分别对该三种遍历的非递归遍历方式进行了仿真,主要用到的数据结构是栈。

       初学者对三种序列的顺序容易搞混淆,这里首先提供一种简单的记忆方式。一颗二叉树简单分为根节点,左节点,右节点。按照根节点在遍历中的顺序,例如,前序,那么就是根节点在前面,可以很好的记忆三种遍历方式。

后续遍历

非递归实现

Leecode145题:点击打开链接


    vector<int> postorderTraversal(TreeNode* root) {
        vector<int>res;
        stack<TreeNode*>toVisit;
        TreeNode* pCurrent=root;
        TreeNode* pLastNode=nullptr;
        while(pCurrent||!toVisit.empty()){
            if(pCurrent){
                toVisit.push(pCurrent);
                pCurrent=pCurrent->left;
            }
            else{
                TreeNode* pTop=toVisit.top();
                if(pTop->right&&pLastNode!=pTop->right){
                    pCurrent=pTop->right;
                }
                else{
                    res.push_back(pTop->val);
                    pLastNode=pTop;
                    toVisit.pop();
                }
            }
        }
        return res;
    }

中序遍历

非递归实现

Leecode94题:点击打开链接


    vector<int> inorderTraversal(TreeNode* root) 
        vector<int> res;
        stack<TreeNode*> toVisit;
        TreeNode* pCurrent = root;
        while (pCurrent || !toVisit.empty()) {
            if (pCurrent) {
                toVisit.push(pCurrent);
                pCurrent = pCurrent -> left;
            }
            else {
                pCurrent = toVisit.top();
                toVisit.pop();
                res.push_back(pCurrent -> val);
                pCurrent = pCurrent -> right;
            }
        }
        return res;
    }

前序遍历

非递归实现

Leecode144题:点击打开链接


    vector<int> preorderTraversal(TreeNode* root) {
        stack<TreeNode *>toVisit;
        vector<int>res;
        if(root==nullptr){
            return res;
        }
        TreeNode *pCurrent=nullptr;
        toVisit.push(root);
        while(!toVisit.empty()){
            pCurrent=toVisit.top();
            res.push_back(pCurrent->val);
            toVisit.pop();
            if(pCurrent->right){
                toVisit.push(pCurrent->right);
            }
            if(pCurrent->left){
                toVisit.push(pCurrent->left);
            }
        }
        return res;
    }


猜你喜欢

转载自blog.csdn.net/heart_leader/article/details/79621561