給定一個二叉樹,返回它的中序 遍歷。java
Given a binary tree, return the inorder traversal of its nodes' values.node
示例:python
輸入: [1,null,2,3]
1
\
2
/
3
輸出: [1,3,2]
複製代碼
進階: 遞歸算法很簡單,你能夠經過迭代算法完成嗎?算法
Follow up: Recursive solution is trivial, could you do it iteratively?數組
百度百科:二叉樹的中序遍歷:baike.baidu.com/item/中序遍歷bash
遍歷順序:左子節點 --> 根節點 --> 右子節點數據結構
以下所示的二叉樹:app
A
/ \
B C
/ \ / \
D E F G
複製代碼
其遍歷順序爲:D -> B -> E -> A ->F -> C -> G函數
二叉樹遍歷能夠用 DFS(深度優先搜索)完成,其實現方式爲:遞歸或藉助數據結構 棧 迭代。學習
這種遍歷方式本質上是一個先進後出的棧式遍歷方式,遞歸方法實際也是用遞歸方式實現棧的先進後出。
Java:
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();//數組
dfs_recursion(root, list);//傳入遞歸函數
return list;
}
private void dfs_recursion(TreeNode node, List<Integer> list) {
if (node == null) return;//基線條件
dfs_recursion(node.left, list);//先遍歷左子節點
list.add(node.val);//遍歷到左子節點的頂點,取出該節點的值
dfs_recursion(node.right, list);//遞歸遍歷右節點
}
}
複製代碼
Python3:
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
#數組
res = list()
#傳入遞歸函數
self.dfs_recursion(root, res)
return res
def dfs_recursion(self, node: TreeNode, res: List[int]):
#基線條件
if not node: return
#遞歸遍歷左子節點
self.dfs_recursion(node.left, res)
#取頂點節點的值
res.append(node.val)
#遞歸遍歷右子節點
self.dfs_recursion(node.right, res)
複製代碼
Java:
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();//數組
if (root == null) return list;
Stack<TreeNode> stack = new Stack<>();//用數據結構棧暫存節點
TreeNode cur = root;//定義當前節點
while (!stack.isEmpty() || cur != null) {//循環條件:棧不空或當前節點不空
if (cur != null) {//當前節點不空時
stack.push(cur);//當前節點入棧
cur = cur.left;//刷新當前節點
} else {//當前節點空時
cur = stack.pop();//當前節點的父節點出棧
list.add(cur.val);//數組存入節點的值
cur = cur.right;刷新當前節點
}
}
return list;
}
}
複製代碼
Python:
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
#初始化數組、棧
res, stack = list(), list()
#當前節點指向根節點
cur = root
#遞歸條件爲:棧或當前節點非空
while stack or cur:
if cur:
#當前節點非空時入棧
stack.append(cur)
#刷新當前節點
cur = cur.left
else:
#當前節點爲空時其父節點出棧
cur = stack.pop()
#其值存入數組
res.append(cur.val)
#刷新當前節點
cur =cur.right
return res
複製代碼
一塊兒學習吖,歡迎關注:愛寫Bug