方法1:递归思路
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<int>result; vector<int> inorderTraversal(TreeNode* root) { Tranverse(root); return result; } void Tranverse(TreeNode* node) { if(node!= NULL) { if(node->left!=NULL) { inorderTraversal(node->left); } result.push_back(node->val); if(node->right!=NULL) { inorderTraversal(node->right); } } } };
方法2:迭代思路:
每到一个节点 A,因为根的访问在中间,将 A 入栈。然后遍历左子树,接着访问 A,最后遍历右子树。
在访问完 A 后,A 就可以出栈了。因为 A 和其左子树都已经访问完成。
代码
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<int>result; //定义一个数组,保存结果 vector<int> inorderTraversal(TreeNode* root) { stack<TreeNode*>S;//用来存放节点 TreeNode*Rt = root; while(Rt||S.size()) { //遍历左子树 while(Rt) //访问根节点及其左子树 { S.push(Rt) ;//遇到根节点先存起来,直到把左子树遍历完 Rt = Rt->left; } Rt = S.top();S.pop();//栈顶元素出栈 //访问根节点 result.push_back(Rt->val); //遍历右子树 Rt = Rt->right; } return result; } };