给定一个二叉树,返回它的中序 遍历。
示例:
输入: [1,null,2,3] 1 2 / 3 输出: [1,3,2]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
1 //递归遍历 2 class Solution { 3 public: 4 vector<int> inorderTraversal(TreeNode* root) { 5 vector<int>res; 6 helper(res, root); 7 return res; 8 } 9 void helper(vector<int>&res, TreeNode* root) { 10 if (root==NULL) 11 return; 12 if (root->left) 13 helper(res, root->left); 14 res.push_back(root->val); 15 if (root->right) 16 helper(res, root->right); 17 } 18 }; 19 20 21 //非递归遍历 22 class Solution { 23 public: 24 vector<int> inorderTraversal(TreeNode* root) { 25 vector<int>res; 26 stack<TreeNode*>s; 27 TreeNode* p = root; 28 while (p || !s.empty()) { 29 while (p) { 30 s.push(p); 31 p = p->left; 32 }//找到最左节点 33 p = s.top(); 34 s.pop(); 35 res.push_back(p->val); 36 p = p->right; 37 } 38 return res; 39 } 40 }; 41 42 43 //另一种解法 44 // Non-recursion and no stack 45 class Solution { 46 public: 47 vector<int> inorderTraversal(TreeNode *root) { 48 vector<int> res; 49 if (!root) return res; 50 TreeNode *cur, *pre; 51 cur = root; 52 while (cur) { 53 if (!cur->left) { 54 res.push_back(cur->val); 55 cur = cur->right; 56 } 57 else { 58 pre = cur->left; 59 while (pre->right && pre->right != cur) pre = pre->right; 60 if (!pre->right) { 61 pre->right = cur; 62 cur = cur->left; 63 } 64 else { 65 pre->right = NULL; 66 res.push_back(cur->val); 67 cur = cur->right; 68 } 69 } 70 } 71 return res; 72 } 73 };