題目描述:
給定一個二叉樹,返回它的中序 遍歷。
示例:
輸入: [1,null,2,3] 1 \ 2 / 3 輸出: [1,3,2]
進階: 遞歸算法很簡單,你可以通過迭代算法完成嗎?
思路:
遞歸 :在類中添加一個列表記錄每個遍歷到的值,寫一個遞歸函數按照中序遍歷訪問.
1.如果當前節點爲空返回.如果當前節點左孩子不爲空,遞歸調用它.
2.再將當前節點的值添加到列表中.
3.如果當前節點右孩子不爲空,遞歸調用它.
迭代:先訪問所有左孩子,利用棧存放訪問經過的父節點,當沒有左子節點時,再彈出棧,並訪問出棧節點的右孩子.對棧中每個節點都做次操作.如果右子節點的左孩子不爲空,繼續進棧直到,左孩子爲空.重複上述步驟.
//遞歸
public class Solution {
private List<Integer> traversal = new ArrayList<>();
private void traverse(TreeNode root) {
if (root == null) return;
if (root.left != null) traverse(root.left);
traversal.add(root.val);
if (root.right != null) traverse(root.right);
}
public List<Integer> inorderTraversal(TreeNode root) {
traverse(root);
return traversal;
}
}
//迭代
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
ArrayList<Integer> result = new ArrayList<>();
if (root == null) return result;
ArrayDeque<TreeNode> stack = new ArrayDeque<>();
do {
while (root != null) {
stack.push(root);
root = root.left;
}
root = stack.pop();
result.add(root.val);
root = root.right;
} while (!stack.isEmpty() || root != null);
return result;
}
}