61:Binary Tree Postorder Traversal

来源:互联网 发布:java线程同步面试题 编辑:程序博客网 时间:2024/05/19 04:52

题目: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?

有三种解法,分别是递归,用栈迭代以及 Morris 前序遍历

解题代码一:

// 递归版本,时间复杂度O(n),空间复杂度O(1)class Solution {public:        vector<int> postorderTraversal(TreeNode* root) {                vector<int> result;                postorderTraversal(root, result);                return result;        }private:        void postorderTraversal(TreeNode* root, vector<int>& result) {                if (root != nullptr) {                        postorderTraversal(root -> left);                        postorderTraversal(root -> right);                        result.push_back(root -> val);                }        }};

解题代码二:

// 用栈迭代,时间复杂度 O(n),空间复杂度 O(n)class Solution {public:        vector<int> postorderTraversal(TreeNode* root) {                vector<int> result;                stack<const TreeNode*> s;                // cur 表示正在访问的节点,prev 表示刚刚访问过的节点                const TreeNode *cur = root, *prev = nullptr;                do {                        while (cur != nullptr) { // 一直往下走                                s.push(cur);                                cur = cur -> left;                        }                        prev = nullptr;                        while (!s.empty()) {                                cur = s.top();                                s.pop();                                // 右孩子不存在或已被访问,访问之                                if (cur -> right == prev) {                                        result.push_back(cur -> val);                                        prev = cur;                                }                                else {                                        //当前节点不能访问,需要第二次进栈                                        s.push(cur);                                        // 先处理右子树                                        cur = cur -> right;                                        break;                                }                        }                } while (!s.empty());                return result;        }};

解题代码三:

// morris 后序遍历// 时间复杂度 O(n),空间复杂度 O(1)class Solution{public:        vector<int> postorderTraversal(TreeNode* root) {                vector<int> result;                TreeNode dummy{-1};                TreeNode *cur;                dummy.left = root;                cur = &dummy;                while (cur != nullptr) {                        if (cur -> left == nullptr)                                cur = cur -> right;                        else {                                TreeNode* node = cur -> left;                                while (node -> right != nullptr && node -> right != cur)                                        node = node -> right;                                if (node -> right == nullptr) {                                        node -> right = cur;                                        cur = cur -> left;                                }                                else {                                        node -> right = nullptr;                                        visit_reverse(cur -> left, node, result);                                        cur = cur -> right;                                }                        }                }                return result;        }private:        // 逆转路径,相当于单链表的反转        static void reverse(TreeNode* from, TreeNode* to) {                TreeNode dummy{-1};                dummy.right = from;                while(from -> right != nullptr) {                        TreeNode* tmp = from -> right;                        from -> right = tmp -> right;                        tmp -> right = dummy.right;                        dummy.right = tmp;                }        }        // 访问逆转后的路径上的所有结点        static void visit_reverse(TreeNode* from, TreeNode* to, vector<int>& result) {                TreeNode* cur = to;                revers(from, to);                while (cur != nullptr) {                        result.push_back(cur -> val);                        cur = cur -> right;                }                reverse(to, from);        }};
0 0