1. 程式人生 > 實用技巧 >LeetCode題解No94——“二叉樹的中序遍歷”

LeetCode題解No94——“二叉樹的中序遍歷”

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時報錯,一定要注意邊界問題

執行結果

遞迴

迭代