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
- 61:Binary Tree Postorder Traversal
- Binary Tree Postorder Traversal
- Binary Tree Postorder Traversal
- Binary Tree Postorder Traversal
- Binary Tree Postorder Traversal
- Binary Tree Postorder Traversal
- Binary Tree Postorder Traversal
- Binary Tree Postorder Traversal
- Binary Tree Postorder Traversal
- Binary Tree Postorder Traversal
- Binary Tree Postorder Traversal
- Binary Tree Postorder Traversal
- Binary Tree Postorder Traversal
- Binary Tree Postorder Traversal
- Binary Tree Postorder Traversal
- Binary Tree Postorder Traversal
- Binary Tree Postorder Traversal
- Binary Tree Postorder Traversal
- 解决UnicodeEncodeError: 'ascii' codec can't encode characters in position 问题
- TCP的三次握手和四次挥手
- Linux环境安装Nexus
- 不使用Cygwin,在eclipse中快速开发JNI,一键生成C头文件.h,以及一键使用NDK交叉编译
- Windows下使用Git管理本地代码
- 61:Binary Tree Postorder Traversal
- 仿QQ群组邀请功能
- In Action
- 收藏一个 漂亮的 Android加载中动画AVLoadingIndicatorView
- 第一天学习
- C++的进一步学习
- 韩国高速vps Kdatacenter
- 496. Next Greater Element I
- Arbitrage