二叉树的前中后序遍历的非递归解法

Posted dtwd886

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树的前中后序遍历的非递归解法相关的知识,希望对你有一定的参考价值。

二叉树的前序遍历非递归解法:

思路:需要借助于一个辅助栈。遍历每个节点时需要把其右子树节点放入到栈中,然后将当前结点的值存入结果中,然后递归遍历其左子树,如果左子树为空,则从栈中取出栈顶结点。

/**
 * Definition for a binary tree node.
 * struct TreeNode 
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) 
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) 
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) 
 * ;
 */
class Solution 
public:
    vector<int> preTraversal(TreeNode* node)
    
        vector<int>result;
        stack<TreeNode*>stk;
        while(node||!stk.empty())
        
            if(node)
            
                result.push_back(node->val);
                if(node->right)
                
                    stk.push(node->right);
                
                node=node->left;
            
            else
            
                node=stk.top();
                stk.pop();
            
        
        return result;
    
    vector<int> preorderTraversal(TreeNode* root) 
        return preTraversal(root);
    
;

二叉树的中序遍历非递归解法:

思路:需要借助于一个辅助栈。遍历每个节点时需要把其放入到栈中,然后递归遍历其左子树,如果当前结点为空,则从栈顶上选出一个结点,将其值存入结果数组中,并遍历其右子树。

/**
 * Definition for a binary tree node.
 * struct TreeNode 
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) 
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) 
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) 
 * ;
 */
class Solution 
public:
    vector<int> inTraversal(TreeNode* node)
    
        stack<TreeNode*>stk;
        vector<int>result;
        while(node||!stk.empty())
        
            if(node)
            
                stk.push(node);
                node=node->left;
            
            else
            
                node=stk.top();
                result.push_back(node->val);
                stk.pop();
                node=node->right;
            
        
        return result;
    
    vector<int> inorderTraversal(TreeNode* root) 
        return inTraversal(root); 
    
;

二叉树的后序遍历非递归解法:

思路:需要借助于一个辅助栈和一个记录前驱结点的临时变量。遍历每个节点时需要把其放入到栈中,然后递归遍历其左结点,如果当前结点为空,则从栈顶上弹出一个结点,只有当其右子树为空或者其右结点等于其前驱时,将其值存入结果数组中,并且更新其前驱并把当前结点置为空,且从栈中弹出当前结点;否则遍历其右右结点。

/**
 * Definition for a binary tree node.
 * struct TreeNode 
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) 
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) 
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) 
 * ;
 */
class Solution 
public:
    vector<int> post_order(TreeNode* node)
    
        TreeNode* prev=nullptr;
        vector<int> result;
        stack<TreeNode*>stk;
        while(node||!stk.empty())
        
            if(node)
            
                stk.push(node);
                node=node->left;
            
            else
            
                node=stk.top();
                if(node->right==nullptr||node->right==prev)
                
                    stk.pop();
                    result.push_back(node->val);
                    prev=node;
                    node=nullptr;
                
                else
                
                    node=node->right;
                
            
        
        return result;
    
    vector<int> postorderTraversal(TreeNode* root) 
        return post_order(root);
    
;

 

以上是关于二叉树的前中后序遍历的非递归解法的主要内容,如果未能解决你的问题,请参考以下文章

二叉树的前中后序遍历(非递归实现)

非递归实现二叉树的前中后序遍历

二叉树的前中后序非递归法

二叉树的前中后序非递归法

二叉树的前中后和层序遍历详细图解(递归和非递归写法)

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