二叉樹(shù)的前中后序遍歷(遞歸,非遞歸版)

二叉樹(shù)的深度遍歷,是面試考驗(yàn)面試者最基本的算法功底,讓我們一起再溫習(xí)一遍。


二叉樹(shù).png

前序遍歷:遍歷順序?yàn)楦?jié)點(diǎn)-> 左子樹(shù)-> 右子樹(shù) 4 2 1 3 6 5 7
中序遍歷: 遍歷順序?yàn)?左子樹(shù)-> 根節(jié)點(diǎn) -> 右子樹(shù) 1 2 3 4 5 6 7
后序遍歷:遍歷順序?yàn)?左子樹(shù)-> 右子樹(shù)-> 根節(jié)點(diǎn) 1 3 2 5 7 6 4

二叉樹(shù)定義:

public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    // TreeNode parent;
    public TreeNode(int val) {
        this.val = val;
    }
}

我們先看看遞歸版該如何遍歷

    // 前序遍歷  遍歷順序?yàn)楦?jié)點(diǎn)-> 左子樹(shù)-> 右子樹(shù)
    public static void preOrder(TreeNode node) {
        if (node != null) {
            System.out.print(node.val+" ");
            preOrder(node.left);
            preOrder(node.right);
        }

    }
    // 中序遍歷  遍歷順序?yàn)?左子樹(shù)-> 根節(jié)點(diǎn) -> 右子樹(shù)
    public static void inOrder(TreeNode node) {
        if (node != null) {
            inOrder(node.left);
            System.out.print(node.val+" ");
            inOrder(node.right);
        }
    }
    // 后序遍歷 遍歷順序?yàn)?左子樹(shù)-> 右子樹(shù)-> 根節(jié)點(diǎn)
    public static void postOrder(TreeNode node) {
        if (node != null) {
            postOrder(node.left);
            postOrder(node.right);
            System.out.print(node.val+" ");
        }
    }

非遞歸版:二叉樹(shù)的深度遍歷 一般借助于棧先進(jìn)后出的特性進(jìn)行遍歷

    // 前序遍歷非遞歸版
    public static void preOrderNonRecursion(TreeNode node) {
        Stack<TreeNode> stack = new Stack();
        while (node != null || !stack.isEmpty()) {
            if (node != null) {
                stack.push(node);
                System.out.println(node.val);
                node = node.left;
            } else {
                node = stack.pop();
                node = node.right;
            }
        }
    }
    // 中序遍歷非遞歸版
    public static void inOrderNonRecursion(TreeNode node) {

        Stack<TreeNode> stack = new Stack<>();
        while (node != null || !stack.isEmpty()) {
            if (node != null) {
                stack.push(node);
                node = node.left;
            } else {
                node = stack.pop();
                System.out.println(node.val);
                node = node.right;
            }
        }
    }
    // 后序遍歷非遞歸版
    public static void postOrderNonRecursion(TreeNode node) {

        TreeNode lastVisit = node; // 用變量記錄右子樹(shù)是否已經(jīng)遍歷
        Stack<TreeNode> stack = new Stack<>();
        while (node != null || !stack.isEmpty()) {
            while (node != null) {
                stack.push(node);
                node = node.left;
            }
            node = stack.peek();
            // 如果沒(méi)有右子樹(shù)或者右子樹(shù)已經(jīng)遍歷 則可以輸出該節(jié)點(diǎn)
            if (node.right == null || node.right == lastVisit) {
                stack.pop();
                System.out.println(node.val);
                lastVisit = node;
                node = null;
            } else
                // 否則處理右子樹(shù)
                node = node.right;
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容