面试常见算法之二叉树后续遍历(反向输出前序遍历的镜像版本)

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector postorderTraversal(TreeNode* root) {
        if (root == NULL)
            return {};
        
        // 后续遍历顺序:左 - 右 - 中
        // 如果做先序遍历的镜像版本:中 - 右 - 左
        // 再逆向输出镜像遍历结果
        // 即得到后续遍历

        // 存放先序遍历的镜像版本
        vector visit;
        TreeNode *point = root;
        vector nodes;

        while (!nodes.empty() || point != NULL) {
            // 访问point
            visit.push_back(point->val);
            // 如果point既有左孩子,又有有孩子,则将point放入nodes中,等待再次访问时取出它的左孩子
            // 并且先访问右孩子
            if (point->left != NULL && point->right != NULL) {
                nodes.push_back(point);
                point = point->right;
            }
            // point只有右/左孩子,直接将point指向右/左孩子
            else if (point->right != NULL)
                point = point->right;
            else if (point->left != NULL)
                point = point->left;
            else{
                // point没有孩子
                // 如果nodes为空,结束遍历
                // 否则point指向nodes最后一个节点的左孩子
                // 并且将nodes最后一个节点移除
                if (nodes.empty())
                    break;
                point = nodes.back()->left;
                nodes.pop_back();
            }
        }

        // 得到结果逆向排序
        reverse(visit.begin(), visit.end());
        return visit;
    }
};

 

你可能感兴趣的:(算法)