日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[Leedcode][JAVA][第94/144/145题][前中后序遍历][递归][迭代][二叉树]

發布時間:2023/12/10 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Leedcode][JAVA][第94/144/145题][前中后序遍历][递归][迭代][二叉树] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【問題描述】[]

  • 前序遍歷 先輸出當前結點的數據,再依次遍歷輸出左結點和右結點

  • 中序遍歷 先遍歷輸出左結點,再輸出當前結點的數據,再遍歷輸出右結點
  • 后續遍歷 先遍歷輸出左結點,再遍歷輸出右結點,最后輸出當前結點的數據

【解答思路】

遞歸 /迭代(棧)
時間復雜度:O(N) 空間復雜度:O(N)

1. 前序遍歷

1.1 遞歸
二叉樹遍歷(前序、中序、后序)的遞歸方法,唯一改變的是記錄節點值操作的位置

class Solution {public List<Integer> preorderTraversal(TreeNode root) {if (root != null) {res.add(root.val);preorderTraversal(root.left);preorderTraversal(root.right);}return res;} }

1.2 迭代(棧)
需要一個輔助棧

class Solution { public List<Integer> preorderTraversal(TreeNode root) {List<Integer> list = new ArrayList<>();Stack<TreeNode> stack = new Stack<>();TreeNode cur = root;while (cur != null || !stack.isEmpty()) {while (cur != null) {//立馬加入當前值list.add(cur.val);stack.push(cur);cur = cur.left; //考慮左子樹}//節點為空,就出棧cur = stack.pop();//考慮右子樹cur = cur.right;}return list; }}
2. 中序遍歷

1.1 遞歸
二叉樹遍歷(前序、中序、后序)的遞歸方法,唯一改變的是記錄節點值操作的位置

class Solution {List<Integer> res = new ArrayList<>();public List<Integer> inorderTraversal(TreeNode root) {if (root != null) {inorderTraversal(root.left);res.add(root.val);inorderTraversal(root.right);}return res;} }

1.2 迭代(棧)
需要一個輔助棧

public List<Integer> inorderTraversal(TreeNode root) {List<Integer> ans = new ArrayList<>();Stack<TreeNode> stack = new Stack<>();TreeNode cur = root;while (cur != null || !stack.isEmpty()) {//節點不為空一直壓棧while (cur != null) {stack.push(cur);cur = cur.left; //考慮左子樹}//節點為空,就出棧cur = stack.pop();//當前值加入ans.add(cur.val);//考慮右子樹cur = cur.right;}return ans; }作者:windliang 鏈接:https://leetcode-cn.com/problems/binary-tree-postorder-traversal/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by--34/ 來源:力扣(LeetCode) 著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
3. 后序遍歷

1.1 遞歸
二叉樹遍歷(前序、中序、后序)的遞歸方法,唯一改變的是記錄節點值操作的位置

class Solution {List<Integer> res = new ArrayList<>();public List<Integer> postorderTraversal(TreeNode root) {if (root != null) {postorderTraversal(root.left);postorderTraversal(root.right);res.add(root.val);}return res;} }

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 轉換思想 后續轉前序 逆轉

后序遍歷的順序是 左 -> 右 -> 根。
前序遍歷的順序是 根 -> 左 -> 右,
左右其實是等價的,所以我們也可以輕松的寫出 根 -> 右 -> 左 的代碼。
然后把 根 -> 右 -> 左 逆序,就是 左 -> 右 -> 根,也就是后序遍歷了。

public List<Integer> postorderTraversal2(TreeNode root) {List<Integer> list = new ArrayList<>();Stack<TreeNode> stack = new Stack<>();TreeNode cur = root;while (cur != null || !stack.isEmpty()) {if (cur != null) {list.add(cur.val);stack.push(cur);cur = cur.right; // 考慮右子樹} else {// 節點為空,就出棧cur = stack.pop();// 考慮左子樹cur = cur.left;}}//翻轉Collections.reverse(list);return list; }

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);位置動態變化
前中序可遍歷,后續遍歷可由前序遍歷修改后逆轉

public List<Integer> preorderTraversal(TreeNode root) {List<Integer> list = new ArrayList<>();Stack<TreeNode> stack = new Stack<>();TreeNode cur = root;while (cur != null || !stack.isEmpty()) {while (cur != null) {stack.push(cur);// 先序遍歷 list.add(cur.val);cur = cur.left; }//節點為空,就出棧cur = stack.pop();// 中序序遍歷 list.add(cur.val);cur = cur.right;//后序遍歷 list.add(cur.val); 需要變得多}return list; }

參考鏈接:https://leetcode.wang/leetcode-145-Binary-Tree-Postorder-Traversal.html

總結

以上是生活随笔為你收集整理的[Leedcode][JAVA][第94/144/145题][前中后序遍历][递归][迭代][二叉树]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日日插日日操 | 在线播放不卡av | 一个人看的www日本高清视频 | 亚洲图片另类小说 | 4444亚洲人成无码网在线观看 | jizz一区二区 | 91美女高潮出水 | 国产精品一卡 | 国产一区 在线播放 | 女同调教视频 | 国产女人18毛片水18精 | 成人av片在线观看 | 久久8| 色av影院 | 国产极品美女高潮无套嗷嗷叫酒店 | 亚洲精品久久久久av无码 | 精东影业一区二区三区 | 超碰青草 | 秋霞电影一区二区 | 国产亚洲综合精品 | 中文字字幕在线观看 | 亚洲欧洲在线观看 | 精品一区欧美 | 中文字幕一区2区3区 | 成人美女在线观看 | av一卡二卡 | 亚洲成人网在线观看 | 日韩一区二区三区不卡视频 | h视频网站在线观看 | 欧美日韩一区二区三区不卡视频 | 日本黄色片一级 | 中文字幕视频在线观看 | 九色首页 | 色大师在线观看 | 亚洲国产视频在线观看 | 欧美激情综合 | 一级欧美一级日韩片 | 免费国产在线视频 | 狠狠干2020| 国产精品v欧美精品v日韩精品 | 亚洲福利一区 | 人人搞人人 | 国产拍拍视频 | 草莓视频成人在线 | 亚洲av成人一区二区国产精品 | 亚洲看片| 亚洲成年人在线 | 亚洲一线av | 国语对白av | 草草在线观看 | 九九久久国产精品 | 午夜影视在线观看 | 丰满大肥婆肥奶大屁股 | 午夜天堂精品久久久久 | 日本久久久网站 | 精品国产一区二区三区久久狼黑人 | 理论片91| 欧美视频在线观看一区二区 | 欧美大喷水吹潮合集在线观看 | 成人三级晚上看 | 狠狠干影院 | 国内av片 | 亚洲精品免费视频 | 无码日韩人妻精品久久蜜桃 | 欧洲精品在线观看 | 欧美一级在线观看 | 国产精品久久91 | 欧美日韩亚洲色图 | 欧美日韩中文在线观看 | 韩日av网站| 播播网色播播 | 人妻视频一区 | 欧美黑人疯狂性受xxxxx喷水 | 中文字幕第一页在线 | 超碰av在线免费观看 | www.久久成人| 日韩精品福利 | 波多野结衣精品在线 | 在线日韩视频 | 中国a毛片| 亚洲av无码一区二区二三区 | 午夜一区二区三区四区 | 黄色国产一级片 | 91九色丨porny丨国产jk | 亚洲国产精品成人无久久精品 | 神秘马戏团在线观看免费高清中文 | 国产精品一线 | 夜夜骑天天干 | 欧美gv在线观看 | 国产精品hd | 久久依人网| 亚洲视频区| 精品人妻互换一区二区三区 | 国产精品情侣呻吟对白视频 | 日韩成人精品视频 | 欧美在线观看网站 | 欧洲一区在线观看 | 国产精品一二区在线观看 | 国精产品一二三区精华液 |