前序和中序遍歷之非遞迴實現
阿新 • • 發佈:2021-02-14
技術標籤:資料結構與演算法
前序和中序遍歷之非遞迴實現
非遞迴實現方式
遞迴 —— 有去有回
先解決子問題 再基於子問題 解決當前問題
也可以理解為 是解決有依賴關係的多個問題
fib(3) A -> fib(2) B -> fib(1) C
呼叫關係
開始處理A
因為A依賴B 開始處理B
因為B依賴C 開始處理C
C處理完成
B處理完成
A處理完成
後進先出的處理關係 – 棧
a) 先序和中序遍歷的非遞迴處理分析
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; } } }