【每日一題】二叉樹的前中後序非遞迴整理

長林攻城獅發表於2020-09-29

本文整理並介紹二叉樹的三種遍歷所使用的資料結構和遍歷方式。

一、前序遍歷

題目描述:給定一個二叉樹,返回它的 前序 遍歷。
在這裡插入圖片描述
遞迴很簡單,要求用非遞迴實現。

思路: 棧,遍歷時先存放右節點,再存放左節點,能夠保證遍歷到的是前序序列。

public List<Integer> preorderTraversal(TreeNode root) {
        LinkedList<TreeNode> stack = new LinkedList<>();
        List<Integer> list = new ArrayList<>();
        if(root == null)
            return list;
        stack.addLast(root);
        while(!stack.isEmpty()){
            TreeNode temp = stack.removeLast();
            list.add(temp.val);
            if(temp.right != null){ //棧中先存放右節點
                stack.addLast(temp.right);
            }
            if(temp.left != null){ //再存放左節點
                stack.addLast(temp.left);
            }
        }
        return list;
    }

二、中序遍歷

題目描述:給定一個二叉樹,返回它的中序 遍歷。
在這裡插入圖片描述
遞迴演算法很簡單,你可以通過迭代演算法完成嗎?

思路:棧,依次遍歷左節點存放到棧中,然後當前節點非空時彈棧,再遍歷右節點。

 //中序遍歷:左根右
   public List<Integer> inorderTraversal(TreeNode root){
        Stack<TreeNode> stack = new Stack<>();
        List<Integer> list = new ArrayList<>();
        TreeNode cur = root;
        //迴圈結束的標記為cur為空,並且棧為空
        while(cur != null || !stack.isEmpty()){
            while(cur != null){
                stack.add(cur);
                cur = cur.left; //先遍歷左節點
            }
            TreeNode temp = stack.pop();//再操作根節點
            list.add(temp.val);
            cur = temp.right;//再遍歷右節點
        }
        return list;
    }

三、後序遍歷

題目描述:給定一個二叉樹,返回它的後序 遍歷。
在這裡插入圖片描述
遞迴演算法很簡單,你可以通過迭代演算法完成嗎?
思路: 棧+雙向連結串列(逆向插入)
非遞迴:棧中先入左節點,後入右節點,彈出時先彈右節點;插入連結串列後要倒序一遍,可以直接每次都插在最前面
左右根的後序遍歷,採用逆向思維,每次存放都存在最左邊
每從棧中彈一個就存到list的最前邊
先存根節點,然後左節點入棧,再右節點入棧,彈出時先彈右節點

/**
    * 非遞迴:棧中先入左節點,後入右節點,彈出時先彈右節點;插入連結串列後要倒序一遍,可以直接每次都插在最前面
    *  左右根的後序輸出,採用逆向思維,存放時順序為根右左,只不過每次存放都存在最左邊
    * 每從棧中彈一個就存到list的最前邊
    * 先存根節點,然後左節點入棧,再右節點入棧,彈出時先彈右節點
    * 
    */
    public List<Integer> postorderTraversal(TreeNode root) {
        LinkedList<TreeNode> stack = new LinkedList<TreeNode>();
        //結果集採用雙向連結串列,在存放值的時候存放在最左邊
        LinkedList<Integer> output = new LinkedList<>();
        if(root == null)
            return output;
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode temp = stack.pop();
            output.addFirst(temp.val); //存值到最前邊,不用倒序翻轉了
            if(temp.left != null)
                stack.push(temp.left);
            if(temp.right != null)
                stack.push(temp.right);
        }
        return output;
    }

相關文章