[牛客网-Leetcode] #树 中等 binary-tree-postorder-traversal

二叉树的后序遍历 binary-tree-postorder-traversal

题目描述

求给定的二叉树的后序遍历。
例如:
给定的二叉树为{1,#,2,3},
1↵ ↵ 2↵ /↵ 3↵
返回[3,2,1].
备注;用递归来解这道题太没有新意了,可以给出迭代的解法么?

Given a binary tree, return the postorder traversal of its nodes’ values.
For example:
Given binary tree{1,#,2,3},
1↵ ↵ 2↵ /↵ 3↵

return[3,2,1].

Note: Recursive solution is trivial, could you do it iteratively?

解题思路

思路1:递归

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 * };
 */

class Solution {
    
    
public:
    vector<int> postorderTraversal(TreeNode* root) {
    
    
        vector<int> res;
        if(root == NULL) return res;
        postorder(root, res);
        return res;
    }
    void postorder(TreeNode* root, vector<int>& res) {
    
    
        if(root == NULL) return ;
        postorder(root -> left, res);
        postorder(root -> right, res);
        res.push_back(root -> val);
    }
};

思路2:迭代

  • 利用前序遍历的迭代解法,前序遍历得到的是中-左-右,将其变为中-右-左(入栈顺序变一下即可,左子树先入栈),然后将结果reverse一下得到左-右-中,即为后序遍历。

  • 翻转res数组: reverse(res.begin(), res.end());

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 * };
 */

class Solution {
    
    
public:
    vector<int> postorderTraversal(TreeNode* root) {
    
    
        vector<int> res;
        if(root == NULL) return res;
        stack<TreeNode*> mystack;
        mystack.push(root);
        
        while(!mystack.empty()) {
    
    
            TreeNode* temp = mystack.top();
            mystack.pop();
            res.push_back(temp -> val);
            //更换入栈次序,先左再右
            if(temp -> left) mystack.push(temp -> left);
            if(temp -> right) mystack.push(temp -> right);
        }
        reverse(res.begin(), res.end());
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/cys975900334/article/details/106882384
今日推荐