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
給定一個二叉樹,返回它的中序 遍歷。node
Example:git
Input: [1,null,2,3]
1
\
2
/
3
Output: [1,3,2]
複製代碼
Follow up: Recursive solution is trivial, could you do it iteratively?github
進階: 遞歸算法很簡單,你能夠經過迭代算法完成嗎?算法
1)二叉樹的前、中、後遍歷,首先明白前、中、後遍歷的順序是什麼,對於二叉樹的中序遍從來說,順序是左子樹節點 —> 根節點 —> 右子樹節點。編程
2)一般遞歸的方法解決二叉樹的遍歷最方便不過,可是我仍是喜歡增長點難度,用通常的迭代循環來實現。bash
遞歸法:spa
1)判斷當前樹是否爲空。code
2)遞歸樹的左子樹結點。
3)輸出當前結點的值。
4)遞歸樹的右子樹節點。
迭代循環法:
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;
}
複製代碼
歡迎一塊兒加入到 LeetCode 開源 Github 倉庫,能夠向 me 提交您其餘語言的代碼。在倉庫上堅持和小夥伴們一塊兒打卡,共同完善咱們的開源小倉庫! Github:https://github.com/luxiangqiang/JS-LeetCode 歡迎關注我我的公衆號:「一個不甘平凡的碼農」,記錄了本身一路自學編程的故事。1)試着分別寫出前序遍歷、後序遍歷的遞歸實現和迭代實現代碼。