【LeetCode笔记】94 144 145. 二叉树的前序、中序、后序遍历的迭代与递归(Java、dfs、迭代)
生活随笔
收集整理的這篇文章主要介紹了
【LeetCode笔记】94 144 145. 二叉树的前序、中序、后序遍历的迭代与递归(Java、dfs、迭代)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一. 題目描述
- 二. 代碼 & 思路
- 1. 遞歸的寫法
- 2. 迭代的寫法(本文重點來了)
- 1) 前序
- 2) 中序
- 3) 后序
直接來個整合吧,也方便看。之前只寫了遞歸的,現在補上迭代的(迭代才是考點!)
是面試高頻題,要好好掌握好各自間的區分哦!
一. 題目描述
題目描述基本上一樣,就只展示中序的題干了
二. 代碼 & 思路
1. 遞歸的寫法
- 這里比較簡單,就不贅述了,就是換換順序。
2. 迭代的寫法(本文重點來了)
說實話,三份代碼簡直模版:while & if else & stack,寫的前五行代碼是一樣的
- 首先明確一點,棧的作用。
- 前面的遞歸寫法,就是 JVM 隱式地幫我們進行了棧的操作
- 迭代:用棧模仿虛擬機的調用過程
- 前序 & 中序很像,后序相對難一點,需要維護一個 pre 結點
1) 前序
class Solution {List<Integer> ans = new ArrayList<>();public List<Integer> preorderTraversal(TreeNode root) {// 迭代:通過棧模擬虛擬機的遞歸結構Stack<TreeNode> myStack = new Stack<>();TreeNode now = root;// 前中后寫的前五行代碼都是一樣的while(now != null || !myStack.isEmpty()){// 非null情況:先加再說!入棧,然后直接往左走if(now != null){ans.add(now.val);myStack.push(now);now = now.left;}// null情況:那就走父結點的右邊!else {now = myStack.pop().right;}}return ans;} }2) 中序
- 和前序相比,都是一路向左,到頭了就取父結點的右邊
- 不同之處在于,ans.add的位置,前序 & 中序分布在 if else 中
3) 后序
- 非null情況處理,和中序完全一樣
- 唯一一個使用了peek的,也就是說:null情況不一定會pop
- 代碼重點在于:null 情況部分,詳細見代碼
- pre 的更新是從底向上的(有點抽象,結合代碼可能比較好理解)
總結
以上是生活随笔為你收集整理的【LeetCode笔记】94 144 145. 二叉树的前序、中序、后序遍历的迭代与递归(Java、dfs、迭代)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言入门经验:零基础如何学习C语言?
- 下一篇: python输入文字、成为字典_Pyth