題目描述:java
給定一個二叉樹,返回它的中序遍歷。node
示例: 輸入: [1,null,2,3] 1 \ 2 / 3 輸出: [1,3,2] 進階: 遞歸算法很簡單,你能夠經過迭代算法完成嗎?
思路解析:算法
1)遞歸:沒啥說的,左子樹->根->右子樹順序去遍歷函數
2)迭代計算:用棧,再用一個指針模擬訪問過程指針
代碼實現:blog
1)遞歸遞歸
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { //返回該二叉樹的中序遍歷 public static List<Integer> inorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<>(); dfsTraversal(res, root); return res; } private static void dfsTraversal(List<Integer> res, TreeNode root) { if (root == null) { return; } dfsTraversal(res, root.left); res.add(root.val); dfsTraversal(res, root.right); } }
2)迭代:it
public static List<Integer> inorderTraversal(TreeNode root) { //藉助一個佔來實現 List<Integer> res = new ArrayList<>(); Stack<TreeNode> stack = new Stack<>(); if (root == null) { return res; } TreeNode pNode = root; while (!stack.isEmpty() || pNode != null) { while (pNode != null) { stack.push(pNode); pNode = pNode.left; } //出棧,彈出元素加入結果集 TreeNode node = stack.pop(); res.add(node.val); pNode = node.right; } return res; }
時間複雜度:O(n)。遞歸函數 T(n)=2⋅T(n/2)+1。
空間複雜度:最壞狀況下須要空間O(n)(每一個節點只有一顆子樹),平均狀況爲O(logn)(滿二叉樹結構排列)。io