【leetcode】 二叉树的后序遍历c++

给定一个二叉树,返回它的 后序 遍历。

示例:

输入: [1,null,2,3]
1

2
/
3
输出: [3,2,1]

递归法 代码:

/**
 * 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> v;
    void solve(TreeNode* root){
    
       //左右中
        if(root==NULL)return;
        solve(root->left);
        solve(root->right);
        v.push_back(root->val);
    }
    vector<int> postorderTraversal(TreeNode* root) {
    
    
        if(root==NULL)return v;
        solve(root);
        return v;
    }
};

当前节点先处理左节点,再处理右节点,然后把该节点的值加入vector。

迭代法 代码:

/**
 * 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:
    stack<TreeNode*> s;  //存储待处理节点
    stack<int> s2;  //用来对结果反序
    vector<int> v;
    vector<int> postorderTraversal(TreeNode* root) {
    
      //后序遍历是左右中 前序遍历是中左右 中左右变中右左 再反序为左右中
        if(root==NULL)return v;
        s.push(root);
        while(!s.empty()){
    
    
            TreeNode* node = s.top();
            s2.push(node->val);  //当前节点的值存入栈s2
            s.pop(); //处理完的节点出栈
            if(node->left!=NULL){
    
    
                s.push(node->left);
            }
            if(node->right!=NULL){
    
    
                s.push(node->right);
            }
        }
        //反序得到后序遍历的结果
        while(!s2.empty()){
    
    
            v.push_back(s2.top());
            s2.pop();
        }
        return v;
    }
};

注意后序遍历的顺序是左右中,使用栈来保存待处理节点,没有办法先放入左右节点后把该节点值加入vector(可以画节点入栈的顺序图看一下)。但前序遍历中左右可以用栈处理。

借助前序遍历。前序遍历顺序为中左右,若改变子节点入栈顺序变成中右左,再通过栈的先进后出特点反序,即可得到左右中

猜你喜欢

转载自blog.csdn.net/qq_40315080/article/details/117534847