Binary Tree Inorder Traversal

题目:

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 }

 

posted on 2015-11-09 15:27  已停更  阅读(159)  评论(0编辑  收藏  举报