###### tags: `Leetcode` `easy` `tree` `python` `c++` # 145. Binary Tree Postorder Traversal ## [題目出處:] https://leetcode.com/problems/binary-tree-postorder-traversal/ ## 題目: Given the root of a binary tree, return the postorder traversal of its nodes' values. **Follow up: Recursive solution is trivial, could you do it iteratively? ** ## 解題想法: ##### 參考 [94. Binary Tree Inorder Traversal]https://hackmd.io/@Hungen/HJ5n2VI1j ##### 參考 [144. Binary Tree Preorder Traversal]https://hackmd.io/@Hungen/HJxk7DUyj **Postorder: 左右(中)** 可以轉換成-> **(中)右左 再reverse**!!! ## 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 postorderTraversal(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.dfs(root.right) self.res.append(root.val) class SolutionIt: #原本: 左右(中): 想法: 先求 (中)右左 再反轉 def postorderTraversal(self,root): stack=[] res=[] while root or stack: if root: res.append(root.val) stack.append(root) root=root.right else: cur=stack.pop() root=cur.left return res[::-1] root=TreeNode(1) root.insertRight(2) root.right.insertLeft(3) print("Original:",end=" ") root.printTree() Recursive=SolutionRe() re=Recursive.postorderTraversal(root) print("Recursive: ",re) Iterative=SolutionIt() it=Iterative.postorderTraversal(root) print("Iterative: ",it) ``` ## C++ ( Recursive & Iterative ): ``` cpp= #include<iostream> #include<vector> #include<queue> #include<stack> #include<algorithm> 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){} }; void InsertLeft(TreeNode* root, int data){ TreeNode* tmp=root; if (tmp->left) InsertLeft(tmp->left,data); else{ TreeNode* new_node=new TreeNode(data); tmp->left=new_node; } } void InsertRight(TreeNode* root, int data){ TreeNode* tmp=root; if (tmp->right) InsertRight(tmp->right,data); else{ TreeNode *new_node=new TreeNode(data); tmp->right=new_node; } } void PrintTree(TreeNode* root){ TreeNode* tmp=root; vector<int> res; queue<TreeNode*> que; que.push(tmp); while(!que.empty()){ TreeNode* cur=que.front(); que.pop(); res.push_back(cur->val); if (cur->left) que.push(cur->left); if (cur->right) que.push(cur->right); } cout<<"Original Tree: "; for (int i=0; i<res.size(); i++){ cout<<res[i]<<" "; } cout<<endl; } class SolutionRe{ public: vector<int> postorderTraversal(TreeNode* root){ vector<int> res; Traversal(root,res); return res; } void Traversal(TreeNode* root, vector<int>& res){ if (!root) return; Traversal(root->left,res); Traversal(root->right,res); res.push_back(root->val); } }; class SolutionIT{ public: vector<int> postorderTraversal(TreeNode* root){ vector<int> res; stack<TreeNode*> tmp; // left right (mid)= reverse(mid right left) while (root || !tmp.empty()){ if (root){ res.push_back(root->val); tmp.push(root); root=root->right; } else{ TreeNode* cur=tmp.top(); tmp.pop(); root=cur->left; } } //<algorithm> reverse(res.begin(),res.end()); return res; } }; void PrintVector(vector<int>& nums){ for (int i=0; i<nums.size(); i++){ cout<<nums[i]<<" "; } cout<<endl; } int main(){ TreeNode* root=new TreeNode(1); InsertRight(root,2); InsertLeft(root->right,3); PrintTree(root); SolutionRe Recursive; vector<int> re=Recursive.postorderTraversal(root); cout<<"Preorder: "; PrintVector(re); SolutionIT Iterative; vector<int> it=Iterative.postorderTraversal(root); cout<<"Preorder: "; PrintVector(it); return 0; } ```