Time:2019/4/25
Title:Binary Tree Inorder Traversal
Difficulty: Medium
Author:小鹿javascript
Given a binary tree, return the inorder traversal of its nodes' values.java
給定一個二叉樹,返回它的 中序 遍歷。
Example:node
Input: [1,null,2,3] 1 \ 2 / 3 Output: [1,3,2]
Follow up: Recursive solution is trivial, could you do it iteratively?git
進階: 遞歸算法很簡單,你能夠經過迭代算法完成嗎?
1)二叉樹的前、中、後遍歷,首先明白前、中、後遍歷的順序是什麼,對於二叉樹的中序遍從來說,順序是左子樹節點 —> 根節點 —> 右子樹節點。2)一般遞歸的方法解決二叉樹的遍歷最方便不過,可是我仍是喜歡增長點難度,用通常的迭代循環來實現。github
遞歸法:1)判斷當前樹是否爲空。算法
2)遞歸樹的左子樹結點。編程
3)輸出當前結點的值。code
4)遞歸樹的右子樹節點。遞歸
迭代循環法:ip
1)聲明一個棧,將樹的左子節點入棧。
2)每出棧一個結點,輸出當前結點的值,且將該結點的右子樹進行遍歷打印,保證每一個出棧的結點輸出值以後,再輸出上一個左子節點以前,將當前結點的右子節點遍歷畢。
3)整棵樹遍歷完畢的終止條件就是當前棧是否存在結點(樹的左子節點)。
var inorderTraversal = function(root) { let arr = [] const inorder = root =>{ // 判斷當前的結點是否爲空 if(root == null) return null; // 遞歸左子樹 inorder(root.left) // 輸出結點值 arr.push(root.val) // 遞歸右子樹 inorder(root.right) } inorder(root) return arr };
// 迭代實現二叉樹的中序遍歷 var inorderTraversal = function(root) { let stack = []; let result = []; while(true){ // 判斷樹是否爲空 if(root == null) return result; // 先將樹的左子節點推入棧中 while(root !== null){ stack.push(root); root = root.left; } // 遍歷的終止條件 if(stack.length !== 0){ // 輸出棧中的結點 let temp = stack.pop(); result.push(temp.val); // 若是當前存在右子節點,要先打印右子樹節點 root = temp.right; }else{ break; } } return result; }
1)試着分別寫出前序遍歷、後序遍歷的遞歸實現和迭代實現代碼。