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;
}