LeetCode題解No94——“二叉樹的中序遍歷”
阿新 • • 發佈:2020-09-14
LeetCode題解
No94
難度:Middle
題目描述:
/*
給定一個二叉樹,返回它的中序 遍歷。
示例:
輸入: [1,null,2,3]
1
\
2
/
3
輸出: [1,3,2]
進階: 遞迴演算法很簡單,你可以通過迭代演算法完成嗎?
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/binary-tree-inorder-traversal
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
*/
題目思路
看到二叉樹遍歷的題目,第一個思路就是對其進行遞迴即可,只需要注意其遍歷的一個順序,中序:左根右,前序:左右根,後序:根左右。遞迴的程式碼很好寫,一看就能明白。題目也提到了嘗試要用迭代的方法去做一遍,最開始其實是沒什麼思路,後面看了官方題解恍然大悟,維護一個棧即可。首先先把最左邊的節點遍歷,然後進行回溯上一個根節點,最後再判斷是否有右節點即可。詳細的看程式碼,也是比較容易理解的
程式碼執行
// 用一個List存放答案 List<Integer> ans = new ArrayList<>(); // 遞迴的方法 public List<Integer> inorderTraversal(TreeNode root) { // 特判 if (root == null){ return ans; } // 根據左右根的方法遞迴 if (root.left!=null){ inorderTraversal(root.left); } // 如果當前節點不為空,加入ans裡 if (root!=null){ ans.add(root.val); } if (root.right!=null){ inorderTraversal(root.right); } return ans; } // 迭代的方法 public List<Integer> inorderTraversal2(TreeNode root){ // 迭代的關鍵是維護棧 // 存放答案的List List<Integer> list = new ArrayList<>(); Deque<TreeNode> stack = new LinkedList<>(); // 特判 if (root == null){ return list; } //開始遞迴,迴圈條件——root不為空或者棧不為空即可 while (root != null || !stack.isEmpty()){ // 由中序遍歷順序可知,先把所有的左節點加入棧中,沒有時再出棧 while (root!=null){ stack.push(root); root = root.left; } // 當走到最左邊的節點的時候,將其出棧 root = stack.pop(); // 加入到結果集 list.add(root.val); // 如果當前的root有右節點,令root為由節點,再回到迴圈體中的while去找當前子樹的左節點 root = root.right; } return list; }
糾錯
1:遞迴沒有進行特判,導致root == null時報錯,一定要注意邊界問題
執行結果
遞迴
迭代