LeetCode94-二叉樹的中序遍歷
阿新 • • 發佈:2020-11-30
非商業,LeetCode連結附上:
https://leetcode-cn.com/problems/binary-tree-inorder-traversal/
進入正題。
題目:
給定一個二叉樹的根節點root
,返回它的中序遍歷。
示例:
示例 1:
輸入:root = [1,null,2,3]
輸出:[1,3,2]
示例 2:
輸入:root = []
輸出:[]
程式碼實現:
//節點 class TreeNode { int val; TreeNode left; TreeNode right; public TreeNode(int val) { this.val = val; } } //方法一 遞迴 class Solution { public List<Integer> inorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<>(); inOrder(root, res); return res; } public void inOrder(TreeNode root, List<Integer> res) { if(root == null) { return; } inOrder(root.left, res); res.add(root.val); inOrder(root.right, res); } } //時間複雜度O(n),空間複雜度O(n) //方法二 迭代(棧) class Solution { public List<Integer> inorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<>(); Deque<TreeNode> stack = new LinkedList<>(); while (root != null || !stack.isEmpty()) { while (root != null) { stack.push(root); root = root.left; } root = stack.pop(); res.add(root.val); root = root.right; } return res; } } //時間複雜度O(n),空間複雜度O(n)
分析:
二叉樹的中序遍歷就是按“左-中-右”的順序遍歷所有的節點;
二叉樹的遍歷,遞迴需要更抽象的思考,怎樣設定結束條件,如何“遞”、怎麼“歸”;
迭代的方法是充分的利用棧的性質,將root節點及所有的左節點依次入棧,當不再有左節點時出棧,並將當前節點的右節點作為新的root節點遍歷。
--End