###### tags: `Leetcode` `easy` `tree` `python` `c++` `Top 100 Liked Questions` # 94. Binary Tree Inorder Traversal ## [題目出處:] https://leetcode.com/problems/binary-tree-inorder-traversal/ ## 題目: Given the root of a binary tree, return the inorder traversal of its nodes' values. **Follow up: Recursive solution is trivial, could you do it iteratively?** ## 解題想法: Inorder: 左(中)右 * 迭代: * step1: root一路往左子遍歷,依序存入stack直到root==None * step2: pop出stack最頂的: 設為cur * step3: root=cur.right 繼續step1 ## Python(Recursive & Iterative): ``` python: class TreeNode(object): def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def insertLeft(self,node): if self.left==None: self.left=TreeNode(node) else: self.left.insertLeft(node) def insertRight(self,node): if self.right==None: self.right=TreeNode(node) else: self.right.insertRight(node) def printTree(self): root=self stack=[root] res=[] while stack: root=stack.pop(0) res.append(root.val) if root.left: stack.append(root.left) if root.right: stack.append(root.right) print(res) class SolutionRe(): def inorderTraversal(self, root): """ :type root: TreeNode :rtype: List[int] """ self.res=[] self.dfs(root) return self.res def dfs(self,root): if not root: return self.dfs(root.left) self.res.append(root.val) self.dfs(root.right) class SolutionIt: def inorderTraversal(self,root): stack=[] res=[] while root or stack: if root: stack.append(root) root=root.left else: cur=stack.pop() res.append(cur.val) root=cur.right return res root=TreeNode(1) root.insertRight(2) root.right.insertLeft(3) print("Original:",end=" ") root.printTree() Recursive=SolutionRe() re=Recursive.inorderTraversal(root) print("Recursive: ",re) Iterative=SolutionIt() it=Iterative.inorderTraversal(root) print("Iterative: ",it) ``` ## C++(Recursive & Iterative): ``` cpp= #include<iostream> #include<vector> #include<queue> #include<stack> using namespace std; struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0), left(nullptr), right(nullptr) {} TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} }; void InsertLeft(TreeNode* root, int data){ TreeNode *tmp=root; while (tmp->left != nullptr){ tmp=tmp->left; } TreeNode *new_left = new TreeNode(data); tmp->left = new_left; } void InsertRight(TreeNode* root, int data){ TreeNode *tmp=root; while (tmp->right != nullptr){ tmp=tmp->right; } TreeNode *new_right = new TreeNode(data); tmp->right = new_right; } void printTree(TreeNode* root){ TreeNode *tmp=root; queue<TreeNode *> que; vector<int> res; que.push(tmp); while ( !que.empty()){ TreeNode * cur_root=que.front(); //get head que.pop(); res.push_back(cur_root->val); if (cur_root->left != nullptr) que.push(cur_root->left); if (cur_root->right != nullptr) que.push(cur_root->right); } for (int i=0; i<res.size(); i++){ cout<<res[i]<<" "; } cout<<endl; } class SolutionRe { //Recursive public: vector<int> inorderTraversal(TreeNode* root) { vector<int> res; Traversal(root,res); return res; } void Traversal(TreeNode* root,vector<int>& res){ if (root==nullptr) return; Traversal(root->left,res); res.push_back(root->val); Traversal(root->right,res); } }; class SolutionIt { public: vector<int> inorderTraversal(TreeNode* root) { stack<TreeNode*> rootStack; vector<int> res; while (root!=nullptr || !rootStack.empty()){ if (root){ rootStack.push(root); root=root->left; } else{ TreeNode *cur_root=rootStack.top(); rootStack.pop(); res.push_back(cur_root->val); root=cur_root->right; } } return res; } }; int main(){ TreeNode *root= new TreeNode(1); InsertRight(root,2); InsertLeft(root->right,3); cout<<"Original Tree:"; printTree(root); SolutionRe res; vector<int> ans = res.inorderTraversal(root); cout<<"After Inorder_Recursive :"; for (int i=0; i<ans.size(); i++){ cout<<ans[i]<<" "; } cout<<endl; SolutionIt res2; vector<int> ans2 = res2.inorderTraversal(root); cout<<"After Inorder_Iterative :"; for (int i=0; i<ans2.size(); i++){ cout<<ans2[i]<<" "; } cout<<endl; return 0; } ```