日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Java 二叉樹遍歷的常用方法

瀏覽:18日期:2022-08-11 16:01:50
目錄遞歸方式非遞歸方式層次遍歷總結(jié)

采用前序遍歷、中序遍歷、后續(xù)遍歷實(shí)現(xiàn)時(shí),即便采用不同的實(shí)現(xiàn)方式(遞歸方式、非遞歸),它們的算法結(jié)構(gòu)是有很大的相似性。因而針對前三種的遍歷我們會(huì)總結(jié)出對應(yīng)通用的解決框架,便于在解決二叉樹問題時(shí)進(jìn)行使用。

遞歸方式

遞歸方式遍歷二叉樹時(shí),無論是 前序遍歷、中序遍歷 還是 后續(xù)遍歷 的方式,它們最大的區(qū)別就是對節(jié)點(diǎn)數(shù)據(jù)的訪問位置不同。除此之外其結(jié)構(gòu)完全一致,因而我們總結(jié)出如下的框架結(jié)構(gòu):

void traverse(TreeNode root) { //終止條件 if(root == null) return; // 前序遍歷 traverse(root.left); // 中序遍歷 traverse(root.right); // 后序遍歷}

對應(yīng)注釋的位置訪問數(shù)據(jù)就可以實(shí)現(xiàn)不同的遍歷方式。

例如,前序遍歷:

void traverse(TreeNode root) { if(root == null) return; visit(root); traverse(root.left); traverse(root.right);}

同樣的中序遍歷:

void traverse(TreeNode root) { if(root ==null) return; traverse(root.left); visit(root); traverse(root.right);}

后續(xù)遍歷:

void traverse(TreeNode root) { if(root ==null) return; traverse(root.left); traverse(root.right)}

是否非常 easy!!

非遞歸方式

二叉樹非遞歸遍歷說實(shí)話有很多種實(shí)現(xiàn)方式,但本質(zhì)上都是模擬整個(gè)遍歷的過程來實(shí)現(xiàn)的。

為了便于理解,其中前序遍歷、中序遍歷、后序遍歷我們采用一套類似的算法框架。

整個(gè)算法框架如下:

public void traverse(TreeNode root) { // 邊界判斷 if (root == null) { return; } Stack<TreeNode> stack = new Stack<>(); TreeNode current = root; while (current != null || !stack.isEmpty()) { //節(jié)點(diǎn)非空時(shí),證明父節(jié)點(diǎn)的左側(cè)節(jié)點(diǎn)非空,直接入棧 if (current != null) {//前序遍歷 visit(current)stack.push(current);current = current.left; } else {//節(jié)點(diǎn)為空,證明左側(cè)節(jié)點(diǎn)為空,出棧,更換游標(biāo)節(jié)點(diǎn)方向current = stack.pop();//中續(xù)遍歷 visit(current);current = current.right; } } }

后序遍歷它的遍歷順序?yàn)?*'左--> 右--> 根',較之與前序遍歷的'根--> 左--> 右',好像是有很大的相似性,我們能否針對上邊的框架進(jìn)行修改,使由前序遍歷轉(zhuǎn)換成后序遍歷??答案是肯定的,我們可以觀察到,可以先求出遍歷順序是'根--> 右--> 左'**'的節(jié)點(diǎn)序列,再倒序,便剛好是后序遍歷的順序:左右根。而遍歷順序是根右左的話,很好辦,從前序遍歷的代碼中改兩行就是了。

故而,可以選擇使用兩個(gè)棧,其中一個(gè)用于遍歷,另一個(gè)用于結(jié)果的倒序。

實(shí)現(xiàn)代碼如下:

//使用雙棧來實(shí)現(xiàn)后序遍歷 public void postOrderTraverse(TreeNode root){ Stack<TreeNode> stack = new Stack<>(); Stack<Integer> res = new Stack<>(); TreeNode cur = root; while (cur!=null || !stack.isEmpty()) { if (cur!=null){stack.push(cur);res.push(cur.val);cur = cur.right; //修改處 }else{cur = stack.pop();cur = cur.left; // 修改處 } } while (!res.isEmpty()){ visit(res.pop()); } }

至此,非遞歸遍歷完成,是不是也很 easy!!

下邊我們可以看一下最后一種層次遍歷

層次遍歷

層次遍歷本質(zhì)上就是閹割版廣度優(yōu)先遍歷,我們此處就直接給出 BFS 算法的框架:

/*** 給定起始節(jié)點(diǎn)start和目標(biāo)節(jié)點(diǎn)target,返回其最短路徑長度**/int BFS(Node start,Node target){ Queue<Node> q; //核心數(shù)據(jù)結(jié)構(gòu) Set<Node> visited: //某些情況下可以通過byte數(shù)組來進(jìn)行代替 int step = 0; //記錄擴(kuò)散步數(shù) //起始節(jié)點(diǎn)入隊(duì)列 q.add(start); visited.offer(start); while(q not empty) {//必須要用sz來保存q.size(),然后擴(kuò)散sz不能直接使用q.size()int sz = q.size();//將隊(duì)列中的節(jié)點(diǎn)進(jìn)行擴(kuò)散for(int i =0 ; i < sz; i++) { Node cur = q.poll(); // 目標(biāo)節(jié)點(diǎn)判斷 if(cur is target) {return step; } // 鄰接結(jié)點(diǎn)入隊(duì)列 for(Node n:cur.adjs) {//未訪問節(jié)點(diǎn)入隊(duì)列if(n is not int visited) { visitd.add(n); q.offer(n);} }}// 更新步數(shù)step++; }}

此處我們借助 BFS 的框架,直接給出其實(shí)現(xiàn)方法:

void LevelOrder(TreeNode root){ //初始化棧,并放入 Queue<TreeNode> queue; queue.add(root); while( !queue.isEmpty()) {//出棧TreeNode cur = queue.poll();//訪問節(jié)點(diǎn)visit(cur);//向下一層級擴(kuò)散if(cur.left !=null) queue.add(cur.left);if(cur.right !=null) queue.add(cur.right); }}

較之于 BFS,我們會(huì)發(fā)現(xiàn),層次遍歷,少了好多東西,比如不需要 visited 來標(biāo)記已訪問的節(jié)點(diǎn)(二叉樹本身結(jié)構(gòu)的特點(diǎn),不可能出現(xiàn)重復(fù)遍歷),也不需要將隊(duì)列中的節(jié)點(diǎn)進(jìn)行擴(kuò)散等。

總結(jié)

至此,二叉樹的四種遍歷方式總結(jié)完成。我們發(fā)現(xiàn)其實(shí)二叉樹所有的遍歷方式都有一種通用的算法框架,只要掌握算法本身的框架還是比較容易能夠?qū)懗鰧?shí)現(xiàn)代碼的。

以上就是Java 二叉樹遍歷的常用方法的詳細(xì)內(nèi)容,更多關(guān)于Java 二叉樹遍歷的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩区欧美区| 午夜在线视频一区二区区别| 久久亚洲欧洲| 婷婷激情一区| 国产66精品| 激情久久99| 特黄毛片在线观看| 精品少妇av| 国内精品亚洲| 国产资源在线观看入口av| 精品一区二区三区中文字幕视频| 欧美一级二区| 国产日韩一区二区三区在线| 国产精品亲子伦av一区二区三区| 国产日韩一区二区三区在线播放| 国产欧美日韩视频在线| 国产乱码精品一区二区三区四区 | 日本少妇一区| 日韩欧美综合| 亚洲精品电影| 视频一区日韩精品| 欧美亚洲色图校园春色| 国产精品一区二区av交换| 精品一区二区三区中文字幕 | 国产麻豆精品| 精品国产乱码久久久久久1区2匹| 国产精品啊v在线| 成人在线免费观看网站| 激情黄产视频在线免费观看| 亚洲成av人片一区二区密柚 | 亚洲天堂免费电影| 亚洲午夜精品久久久久久app| 91精品高清| 亚洲精品免费观看| 麻豆精品在线| 日韩精品一区二区三区免费观看| 国产日韩综合| 欧美片第1页综合| 欧美aaaaaa午夜精品| 国产精品毛片久久| 亚州av乱码久久精品蜜桃| 亚洲精品麻豆| 精品国产99| 亚洲少妇诱惑| 国产美女撒尿一区二区| 日韩欧美国产精品综合嫩v| 亚洲一区二区三区免费在线观看 | 99在线|亚洲一区二区| 蜜臀av一区二区在线免费观看| 91麻豆精品激情在线观看最新 | 视频一区二区三区入口| 少妇精品久久久| 精品一区二区三区在线观看视频| 亚洲精品欧洲| 成人亚洲欧美| 蜜臀久久99精品久久久久久9 | 在线免费观看亚洲| 国产精品红桃| 婷婷久久一区| 国产欧美精品久久| 色偷偷色偷偷色偷偷在线视频| 中文一区二区| 亚洲精品网址| 天堂va欧美ⅴa亚洲va一国产| 午夜一级在线看亚洲| 欧美中文字幕一区二区| 蜜桃av一区二区三区电影| 久久99视频| 麻豆久久精品| 视频在线不卡免费观看| 日韩中文字幕亚洲一区二区va在线| 麻豆精品一区二区综合av| 日韩午夜av| 免费在线观看一区| 国产亚洲毛片| 国产精品调教| 久久国产66| 色婷婷综合网| 日韩精品乱码av一区二区| 日本高清不卡一区二区三区视频| 欧美日韩一区二区三区不卡视频 | 在线看片国产福利你懂的| 亚洲一区二区三区高清不卡| 国产精品17p| 免费成人性网站| 999久久久亚洲| 麻豆国产精品一区二区三区| 欧美精品一二| 伊人久久大香线蕉av不卡| 色综合五月天| 亚洲三级视频| 久久精品播放| 精品国产乱码久久久久久1区2匹| 蜜臀av国产精品久久久久| 日韩免费一区| 麻豆视频一区| 中文字幕av亚洲精品一部二部 | 蜜桃成人av| 国产一区二区三区日韩精品| 日韩精品成人在线观看| 99视频一区| 蜜桃一区二区三区| 福利在线免费视频| 国产精品4hu.www| 偷拍亚洲精品| 视频一区在线视频| 最新国产拍偷乱拍精品| 在线观看精品| 精品视频一区二区三区四区五区 | 久久99蜜桃| 欧美一区精品| 亚洲欧洲免费| 国产亚洲综合精品| 国产精品白丝av嫩草影院| 亚洲精品麻豆| 午夜久久tv| 国产精品yjizz视频网| 日韩高清一区在线| 免费日韩精品中文字幕视频在线| 99热国内精品| 欧美国产日韩电影| 日韩va亚洲va欧美va久久| 亚洲精品护士| 日本不卡一二三区黄网| 一本一道久久a久久| 国产精品毛片在线看| 亚洲高清影视| 99香蕉国产精品偷在线观看| japanese国产精品| 免费av一区二区三区四区| 亚洲午夜精品久久久久久app| 久久蜜桃av| 黄色国产精品| 欧美精品一区二区久久| 亚洲精品小说| 蜜桃国内精品久久久久软件9| 亚洲婷婷在线| 午夜在线播放视频欧美| 蜜臀av一区二区三区| 婷婷精品在线| 国产精品一国产精品| 麻豆精品视频在线观看免费| 国产成人免费| 999久久久91| 日韩视频在线一区二区三区 | 在线日韩中文| 韩国精品主播一区二区在线观看 | 福利精品在线| 久久精品亚洲人成影院| 国产视频一区三区| 日本久久一区| 开心激情综合| 午夜av成人| 国产精品日韩| 日本亚洲视频| 国产精品a级| 久久久久免费| 精品中文在线| 日韩不卡视频在线观看| 国产精品美女久久久浪潮软件| 麻豆精品网站| 美国三级日本三级久久99 | 国产福利资源一区| 91视频一区| 日韩不卡免费高清视频| 国产精品视区| 日韩一区精品视频| 亚洲免费专区| 精品一区二区三区免费看 | 久久亚洲道色| 999精品一区| 久久亚洲美女| 精品一区二区三区视频在线播放 | 国产一区二区三区天码| 国内精品麻豆美女在线播放视频| 欧美在线观看视频一区| 中文在线一区| 国产精品视频3p| 97精品国产| 日韩中文字幕av电影| 日本不卡视频在线| а√在线中文在线新版| 97se综合| 日韩**一区毛片| 精品国产欧美日韩一区二区三区| 图片区亚洲欧美小说区| 久久国产精品免费一区二区三区 | 2023国产精品久久久精品双| 欧美亚洲tv| 精品三级av在线导航| 香蕉久久久久久久av网站| 亚洲一二三区视频| 国产91欧美| 久热综合在线亚洲精品| 欧美日韩伊人| 亚州av乱码久久精品蜜桃| 日韩三区四区| 99视频精品全部免费在线视频| 亚洲资源网站| 日韩在线不卡|