vector<int> postorderTraversal(TreeNode *root) { vector<int> result; TreeNode dummy(-1); TreeNode *cur, *prev = nullptr; std::function < void(const TreeNode*)> visit = [&result](const TreeNode *node){ result.push_back(node->val); }; dummy.left = root; cur = &dummy; while (cur != nullptr) { if (cur->left == nullptr) { prev = cur; /* 必须要有 */ 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; prev = cur; /* 必须要有 */ cur = cur->left; } else { /* 已经线索化,则访问节点,并删除线索 */ visit_reverse(cur->left, prev, visit); prev->right = nullptr; prev = cur; /* 必须要有 */ cur = cur->right; } } } return result; }
// morris traversal vector<int> postorderTraversal(TreeNode *root) { vector<int> result; TreeNode dummy(-1); TreeNode *cur, *prev = nullptr; std::function < void(const TreeNode*)> visit = [&result](const TreeNode *node){ result.push_back(node->val); }; dummy.left = root; cur = &dummy; while (cur != nullptr) { if (cur->left == nullptr) { prev = cur; //------------------------------- prev为cur的parent------------------------------------------------ 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; prev = cur; cur = cur->left; } else { visit_reverse(cur->left, prev, visit); prev->right = nullptr; prev = cur; cur = cur->right; } } } return result; }