1. 程式人生 > 其它 >前序和中序遍歷之非遞迴實現

前序和中序遍歷之非遞迴實現

技術標籤:資料結構與演算法

前序和中序遍歷之非遞迴實現

非遞迴實現方式

遞迴 —— 有去有回

先解決子問題 再基於子問題 解決當前問題

也可以理解為 是解決有依賴關係的多個問題

fib(3) A -> fib(2) B -> fib(1) C

呼叫關係
開始處理A
因為A依賴B 開始處理B
因為B依賴C 開始處理C
C處理完成
B處理完成
A處理完成

後進先出的處理關係 – 棧

a) 先序和中序遍歷的非遞迴處理分析

image-20201014181111565 image-20201014181003253 image-20201014181022540 image-20201014181039608
   public static void preOrderByLoop(TreeNode node) {
        Stack<TreeNode> stack = new Stack<>();
        // 使用指標  記錄遍歷到哪個節點
        TreeNode p = node;
        while (p != null || !stack.isEmpty()) {
            // 入棧  把當前能讀到的所有左孩子 存入棧中
            while (p != null) {
                System.out.print(p.val + " ");
                stack.push(p);
                p = p.left;
            }
            // 1 2 4 8
            // 1 2 9
            // 1 5
            // 3 6
            // 7
            // 出棧 彈出棧頂元素  並找到其右孩子
            if (!stack.isEmpty()) {
                p = stack.pop();
                p = p.right;
            }
        }
    }

先序是入棧時列印 中序是出棧時列印

public static void inOrderByLoop(TreeNode node) {
        Stack<TreeNode> stack = new Stack<>();
        // 使用指標  記錄遍歷到哪個節點
        TreeNode p = node;
        while (p != null || !stack.isEmpty()) {
            // 入棧  把當前能讀到的所有左孩子 存入棧中
            while (p != null) {
                stack.push(p);
                p = p.left;
            }

            // 出棧 彈出棧頂元素  並找到其右孩子
            if (!stack.isEmpty()) {
                p = stack.pop();
                System.out.print(p.val + " ");
                p = p.right;
            }
        }
    }