电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java 二叉樹遍歷的常用方法

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

采用前序遍歷、中序遍歷、后續遍歷實現時,即便采用不同的實現方式(遞歸方式、非遞歸),它們的算法結構是有很大的相似性。因而針對前三種的遍歷我們會總結出對應通用的解決框架,便于在解決二叉樹問題時進行使用。

遞歸方式

遞歸方式遍歷二叉樹時,無論是 前序遍歷、中序遍歷 還是 后續遍歷 的方式,它們最大的區別就是對節點數據的訪問位置不同。除此之外其結構完全一致,因而我們總結出如下的框架結構:

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

對應注釋的位置訪問數據就可以實現不同的遍歷方式。

例如,前序遍歷:

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);}

后續遍歷:

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

是否非常 easy!!

非遞歸方式

二叉樹非遞歸遍歷說實話有很多種實現方式,但本質上都是模擬整個遍歷的過程來實現的。

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

整個算法框架如下:

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

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

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

實現代碼如下:

//使用雙棧來實現后序遍歷 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!!

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

層次遍歷

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

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

此處我們借助 BFS 的框架,直接給出其實現方法:

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

較之于 BFS,我們會發現,層次遍歷,少了好多東西,比如不需要 visited 來標記已訪問的節點(二叉樹本身結構的特點,不可能出現重復遍歷),也不需要將隊列中的節點進行擴散等。

總結

至此,二叉樹的四種遍歷方式總結完成。我們發現其實二叉樹所有的遍歷方式都有一種通用的算法框架,只要掌握算法本身的框架還是比較容易能夠寫出實現代碼的。

以上就是Java 二叉樹遍歷的常用方法的詳細內容,更多關于Java 二叉樹遍歷的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 避光流动池-带盖荧光比色皿-生化流动比色皿-宜兴市晶科光学仪器 东莞爱加真空科技有限公司-进口真空镀膜机|真空镀膜设备|Polycold维修厂家 | 渣油泵,KCB齿轮泵,不锈钢齿轮泵,重油泵,煤焦油泵,泊头市泰邦泵阀制造有限公司 | 铸铝门厂家,别墅大门庭院大门,别墅铸铝门铜门[十大品牌厂家]军强门业 | 超声波焊接机,振动摩擦焊接机,激光塑料焊接机,超声波焊接模具工装-德召尼克(常州)焊接科技有限公司 | 江苏远邦专注皮带秤,高精度皮带秤,电子皮带秤研发生产 | 带式压滤机_污泥压滤机_污泥脱水机_带式过滤机_带式压滤机厂家-河南恒磊环保设备有限公司 | COD分析仪|氨氮分析仪|总磷分析仪|总氮分析仪-圣湖Greatlake | 河南中整光饰机械有限公司-抛光机,去毛刺抛光机,精密镜面抛光机,全自动抛光机械设备 | 高精度电阻回路测试仪-回路直流电阻测试仪-武汉特高压电力科技有限公司 | 施工电梯_齿条货梯_烟囱电梯_物料提升机-河南大诚机械制造有限公司 | 二次元影像仪|二次元测量仪|拉力机|全自动影像测量仪厂家_苏州牧象仪器 | 吨袋包装机|吨包秤|吨包机|集装袋包装机-烟台华恩科技 | 济南ISO9000认证咨询代理公司,ISO9001认证,CMA实验室认证,ISO/TS16949认证,服务体系认证,资产管理体系认证,SC食品生产许可证- 济南创远企业管理咨询有限公司 郑州电线电缆厂家-防火|低压|低烟无卤电缆-河南明星电缆 | 橡胶接头_橡胶软接头_套管伸缩器_管道伸缩器厂家-巩义市远大供水材料有限公司 | 北京森语科技有限公司-模型制作专家-展览展示-沙盘模型设计制作-多媒体模型软硬件开发-三维地理信息交互沙盘 | 数控走心机-走心机价格-双主轴走心机-宝宇百科 | 振动时效_振动时效仪_超声波冲击设备-济南驰奥机电设备有限公司 北京宣传片拍摄_产品宣传片拍摄_宣传片制作公司-现像传媒 | 全温度恒温培养摇床-大容量-立式-远红外二氧化碳培养箱|南荣百科 | 中药超微粉碎机(中药细胞级微粉碎)-百科 | 武汉高温老化房,恒温恒湿试验箱,冷热冲击试验箱-武汉安德信检测设备有限公司 | 电机铸铝配件_汽车压铸铝合金件_发动机压铸件_青岛颖圣赫机械有限公司 | 岛津二手液相色谱仪,岛津10A液相,安捷伦二手液相,安捷伦1100液相-杭州森尼欧科学仪器有限公司 | 电气控制系统集成商-PLC控制柜变频控制柜-非标自动化定制-电气控制柜成套-NIDEC CT变频器-威肯自动化控制 | YT保温材料_YT无机保温砂浆_外墙保温材料_南阳银通节能建材高新技术开发有限公司 | 苹果售后维修点查询,苹果iPhone授权售后维修服务中心 – 修果网 拼装地板,悬浮地板厂家,悬浮式拼装运动地板-石家庄博超地板科技有限公司 | 合肥白癜风医院_[治疗白癜风]哪家好_合肥北大白癜风医院 | 广州展览制作|展台制作工厂|展览设计制作|展览展示制作|搭建制作公司 | 深圳诚暄fpc首页-柔性线路板,fpc柔性线路板打样生产厂家 | 济南网站建设|济南建网站|济南网站建设公司【济南腾飞网络】【荐】 | 玻璃钢格栅盖板|玻璃钢盖板|玻璃钢格栅板|树篦子-长沙川皖玻璃钢制品有限公司 | 【北京写字楼出租_写字楼租赁_办公室出租网/出售】-远行地产官网 | 丁基胶边来料加工,医用活塞边角料加工,异戊二烯橡胶边来料加工-河北盛唐橡胶制品有限公司 | 光泽度计_测量显微镜_苏州压力仪_苏州扭力板手维修-苏州日升精密仪器有限公司 | 液氨泵,液化气泵-淄博「亚泰」燃气设备制造有限公司 | 南汇8424西瓜_南汇玉菇甜瓜-南汇水蜜桃价格 | 广东风淋室_广东风淋室厂家_广东风淋室价格_广州开源_传递窗_FFU-广州开源净化科技有限公司 | 意大利Frascold/富士豪压缩机_富士豪半封闭压缩机_富士豪活塞压缩机_富士豪螺杆压缩机 | 无锡网站建设_小程序制作_网站设计公司_无锡网络公司_网站制作 | 粘度计,数显粘度计,指针旋转粘度计| 宝鸡市人民医院| 高防护蠕动泵-多通道灌装系统-高防护蠕动泵-www.bjhuiyufluid.com慧宇伟业(北京)流体设备有限公司 |