[Leedcode][JAVA][第94/144/145题][前中后序遍历][递归][迭代][二叉树]
【問題描述】[]
- 前序遍歷 先輸出當前結點的數據,再依次遍歷輸出左結點和右結點
- 中序遍歷 先遍歷輸出左結點,再輸出當前結點的數據,再遍歷輸出右結點
- 后續遍歷 先遍歷輸出左結點,再遍歷輸出右結點,最后輸出當前結點的數據
【解答思路】
遞歸 /迭代(棧)
時間復雜度:O(N) 空間復雜度:O(N)
1. 前序遍歷
1.1 遞歸
二叉樹遍歷(前序、中序、后序)的遞歸方法,唯一改變的是記錄節點值操作的位置
1.2 迭代(棧)
需要一個輔助棧
2. 中序遍歷
1.1 遞歸
二叉樹遍歷(前序、中序、后序)的遞歸方法,唯一改變的是記錄節點值操作的位置
1.2 迭代(棧)
需要一個輔助棧
3. 后序遍歷
1.1 遞歸
二叉樹遍歷(前序、中序、后序)的遞歸方法,唯一改變的是記錄節點值操作的位置
1.2 迭代(棧)
需要兩個輔助棧
-從根節點開始依次迭代,彈出棧頂元素輸出到輸出列表中,然后依次壓入它的所有孩子節點,按照從上到下、從左至右的順序依次壓入棧中。
-因為深度優先搜索后序遍歷的順序是從下到上、從左至右,所以需要將輸出列表逆序輸出。
class Solution {List<Integer> res = new ArrayList<>();public List<Integer> postorderTraversal(TreeNode root) {if (root == null) {return res;}LinkedList<TreeNode> stack = new LinkedList<>();LinkedList<TreeNode> stackTemp = new LinkedList<>();stackTemp.push(root);while (!stackTemp.isEmpty()) {TreeNode curNode = stackTemp.pop();//stack壓入stack.push(curNode);if (curNode.left != null) {stackTemp.push(curNode.left);}if (curNode.right != null) {stackTemp.push(curNode.right);}}//逆序while (!stack.isEmpty()) {res.add(stack.pop().val);}return res;} }1.3 轉換思想 后續轉前序 逆轉
后序遍歷的順序是 左 -> 右 -> 根。
前序遍歷的順序是 根 -> 左 -> 右,
左右其實是等價的,所以我們也可以輕松的寫出 根 -> 右 -> 左 的代碼。
然后把 根 -> 右 -> 左 逆序,就是 左 -> 右 -> 根,也就是后序遍歷了。
1.4 一個棧
public List<Integer> postorderTraversal(TreeNode root) {if (root == null) return new ArrayList<Integer>();TreeNode node = root;List<Integer> ret = new ArrayList<Integer>();Stack<TreeNode> stack = new Stack<TreeNode>();while(node != null || !stack.isEmpty()) {while (node != null) {stack.push(node);node = node.left;}node = stack.pop();// 后序遍歷// 如果沒有右孩子或者右孩子被訪問過了 {@Alex Zheng 感謝建議哈~}if (node.right == null || (ret.size() != 0 && ret.get(ret.size() - 1).equals(node.right.val)) ) {ret.add(node.val);node = null;} else {stack.push(node);node = node.right;}}return ret;}鏈接:https://leetcode-cn.com/problems/binary-tree-postorder-traversal/solution/bian-li-tong-jie-by-long_wotu/【總結】
1. 前中后序遍歷變化的是[中]的位置,左到右的順序不改變
- 前序遍歷 中左右
- 中序遍歷 左中右
- 后續遍歷 左右中
2.pop 與 poll 都是取出 LinkedList 的第一個元素,并將該元素刪除,等效于:removeFirst
不同點:兩者的實現所用數據結構不同,
- poll 是基于隊列結構實現的方法,當隊列中沒有元素時,調用該方法返回 null
- pop 是基于棧結構實現的方法,當棧中沒有元素時,調用該方法會發生異常
3. 遞歸模板
res.add(root.val); 位置動態變化
public List<Integer> preorderTraversal(TreeNode root) {if (root != null) {//先序遍歷 res.add(root.val);preorderTraversal(root.left);//中序遍歷 res.add(root.val);preorderTraversal(root.right);//后序遍歷 res.add(root.val);}return res;}4. 迭代模板
list.add(cur.val);位置動態變化
前中序可遍歷,后續遍歷可由前序遍歷修改后逆轉
參考鏈接:https://leetcode.wang/leetcode-145-Binary-Tree-Postorder-Traversal.html
總結
以上是生活随笔為你收集整理的[Leedcode][JAVA][第94/144/145题][前中后序遍历][递归][迭代][二叉树]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 青岛智能院助力智慧城市 打造智能产业“黄
- 下一篇: dp递推 hdu1978