Morris 遍历二叉树
Morris Traversal 方法实现前序、中序以及后序遍历二叉树。相比使用栈或者递归(也是通过栈空间)方法,Morris 方法可以在空间复杂度为 O(1) ,时间复杂度为 O(n) 的条件下实现对二叉树的遍历。 前序遍历 如果当前节点左孩子 cur->left 为空,输出当前节点 cur 并指向右孩子 cur->right。 如果当前节点左孩子 cur->left 不为空,那么在当前节点的左子树中找出前驱节点 pre,也就是左子树中最大的点。 如果前驱节点的右孩子 pre->right 为空,那么将右孩子指向当前节点。 输出当前节点 。当前节点更新为当前节点的左孩子。 如果前驱节点的右孩子 pre->right 不为空,也就是指向当前节点。重新将右孩子设为空。当前节点更新为当前节点的右孩子。 重复 1、2 直到当前节点为空。 class Solution { public: vector<int> preorderTraversal(TreeNode* root) { TreeNode* cur = root; TreeNode* pre = NULL; vector<int> result; while(cur!=NULL){ if (cur->left == NULL){ result.push_back(cur->val); cur = cur->right;