题目:
Given a binary tree, return the inorder traversal of its nodes' values.
For example:
Given binary tree {1,#,2,3}
,
1 2 / 3
return [1,3,2]
.
Note: Recursive solution is trivial, could you do it iteratively?
confused what "{1,#,2,3}"
means? > read more on how binary tree is serialized on OJ.
解析:
递归:
1 class Solution { 2 public: 3 vector<int> inorderTraversal(TreeNode* root) { 4 vector<int> v; 5 inTraversal(root,v); 6 return v; 7 } 8 9 void inTraversal(TreeNode* root,vector<int>& v) 10 { 11 if(!root) return; 12 inTraversal(root->left,v); 13 v.push_back(root->val); 14 inTraversal(root->right,v); 15 } 16 };
栈非递归
1 class Solution 2 { 3 public: 4 vector<int> inorderTraversal(TreeNode* root) 5 { 6 vector<int> v; 7 if(!root) return v; 8 TreeNode* temp = root; 9 stack<TreeNode*> s; 10 while(true) 11 { 12 while(temp) 13 { 14 s.push(temp); 15 temp = temp->left; 16 } 17 if(s.empty()) break; 18 temp = s.top(); 19 s.pop(); 20 v.push_back(temp->val); 21 temp = temp->right; 22 } 23 return v; 24 } 25 };
不用栈:
1 // iterate, morris traversal, without stack 2 vector<int> inorderTraversal(TreeNode* root) { 3 vector<int> v; 4 if(!root) return v; 5 TreeNode* temp = root, *prev; 6 while(temp){ 7 if(!temp->left){ 8 v.push_back(temp->val); 9 temp = temp->right; 10 }else{ 11 prev = temp->left; 12 while(prev->right&&(prev->right != temp)) 13 prev = prev->right; 14 if(!prev->right){ 15 prev->right = temp; 16 temp = temp->left; 17 }else{ 18 v.push_back(temp->val); 19 prev->right = NULL; 20 temp = temp->right; 21 } 22 } 23 } 24 }