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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

二叉树的前序,中序,后序,层序遍历的递归和非递归实现

發布時間:2025/4/14 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二叉树的前序,中序,后序,层序遍历的递归和非递归实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

直接上代碼

import java.util.Stack;public class BinaryTree {//定義一棵二叉樹,包括左子樹、右子樹、該節點的值和構造器public BinaryTree lchild;public BinaryTree rchild;public char data;public BinaryTree(BinaryTree l,BinaryTree r,char data){lchild = l;rchild = r;this.data = data;}//訪問節點的函數public void visit(BinaryTree t){System.out.println(t.data);}/** 遞歸實現二叉樹的遍歷都是分四步* 1.判斷樹如果為空則返回* 2.訪問節點* 3.判斷左子樹如果不為空則遞歸左子樹* 4.判斷右子樹不為空則遞歸右子樹* 前、中、后三個遍歷的區別就是訪問節點這一步分別實在判斷左子樹前,判斷左子樹和右子樹中間,判斷右子樹之后*///遞歸實現前序遍歷public void pre(BinaryTree t){if(t == null)return;visit(t);if(t.lchild != null)pre(t.lchild);if(t.rchild != null)pre(t.rchild);}//遞歸實現中序遍歷public void mid(BinaryTree t){if(t == null)return;if(t.lchild != null)mid(t.lchild);visit(t);if(t.rchild != null)mid(t.rchild);}//遞歸實現后序遍歷public void pos(BinaryTree t){if(t == null)return;if(t.lchild != null)pos(t.lchild);if(t.rchild != null)pos(t.rchild);visit(t);}/*** 非遞歸實現二叉樹的遍歷都是用棧實現*// /*** 非遞歸實現前序遍歷* 注意由于棧先進后出的特點,順序是:出棧并訪問,右子樹不空壓棧,左子樹不空壓棧*/public void pre2(BinaryTree t){Stack<BinaryTree> s = new Stack<>();s.push(t);while(!s.isEmpty()){BinaryTree b = s.pop();visit(b);if(b.rchild != null)s.push(b.rchild);if (b.lchild != null)s.push(b.lchild);}}/*** 非遞歸實現中序遍歷需要一個中間變量p代表當前樹**//public void mid2(BinaryTree t){Stack<BinaryTree> s = new Stack<>();BinaryTree p = t;while(!s.isEmpty() || p!=null){if(p != null){s.push(p);p = p.lchild;}else{p = s.pop();visit(p);p = p.rchild;}}} /*二叉樹的非遞歸后序遍歷和前序遍歷的不同是先判斷一下是不是沒有孩子或者左右孩子已經訪問,然后才可以訪問該節點*/public List<Integer> postorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();if (root==null)return res;Stack<TreeNode> stack = new Stack<>();TreeNode last = null;TreeNode cur ;stack.push(root);while (!stack.isEmpty()){cur = stack.peek();if ((cur.left==null&&cur.right==null)||last!=null&&(last==cur.left||last==cur.right)){//沒有孩子或者孩子已經遍歷過 res.add(cur.val);last = cur;stack.pop();}else{if (cur.right!=null)stack.push(cur.right);if (cur.left!=null)stack.push(cur.left);}}return res;} }

?還有一種方法:前序遍歷的時候,順序是:根-左-右。現在只要改成:根-右-左,最后在reverse一下

注意由于stack先進后出,前序遍歷的時候是先壓入右,再壓左,這里是先左后右

public ArrayList<Integer> postorderTraversal(TreeNode root) {if(root==null) return new ArrayList();Stack<TreeNode> stack = new Stack();ArrayList<Integer> res = new ArrayList();stack.push(root);while(!stack.isEmpty()){TreeNode cur = stack.pop();res.add(cur.val);if(cur.left!=null) stack.push(cur.left);if(cur.right!=null) stack.push(cur.right);}Collections.reverse(res);return res;}

?層序遍歷:

層序遍歷用BFS

迭代方法:存取節點的結構是queue隊列,常用的實現類是linkedlist,不斷添加節點到隊列后邊

遞歸方法:維護一個二維數組和層數,不同層的數放到不同的數組中

/*迭代方法*/public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> res = new ArrayList<>();if (root==null)return res;Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()){int s = queue.size();List<Integer> cur = new ArrayList<>();for (int i = 0; i < s; i++) {TreeNode temp = queue.poll();cur.add(temp.val);if (temp.left!=null)queue.offer(temp.left);if (temp.right!=null)queue.offer(temp.right);}res.add(cur);}return res;}

遞歸方法:

List<List<Integer>> res = new ArrayList<>();public List<List<Integer>> levelOrder(TreeNode root) {helper(root,0);return res;}public void helper(TreeNode root,int c){if (root==null)return;if (res.size()==c)res.add(new ArrayList<>());List<Integer> cur = res.get(c);cur.add(root.val);if (root.left!=null)helper(root.left,c+1);if (root.right!=null)helper(root.right,c+1);}

?

轉載于:https://www.cnblogs.com/stAr-1/p/7058262.html

總結

以上是生活随笔為你收集整理的二叉树的前序,中序,后序,层序遍历的递归和非递归实现的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 午夜小福利 | 精品成人在线 | av网址导航 | 欧美日韩人妻精品一区 | 日韩免费观看 | 97国产精品久久 | 欧美一区二区三区色 | 伊人视频在线观看 | 欧美一级免费大片 | 亚洲日本成人 | 中文字幕在线免费视频 | 久久爱综合网 | 亚洲成人日韩在线 | 午夜小视频免费 | 打开每日更新在线观看 | 亚洲精品在线影院 | 国产嫩草影视 | 精品无码黑人又粗又大又长 | 男人桶女人桶爽30分钟 | 久久不射影院 | 99热这里只有精品5 国产精品伦子伦免费视频 精品一二三 | 免费观看的av网站 | 欧美一区二区精品 | 香蕉视频在线观看视频 | av射进来| 卡一卡二视频 | 视频久久 | 久久成人午夜 | 日本做爰高潮又黄又爽 | 亚洲国内在线 | h在线网站 | av不卡在线看 | 狠狠澡 | 国产一区二区久久久 | 牛牛影视一区二区三区 | 枫花恋在线观看 | 丁香社区五月天 | 国产精品久久久久久久久久久久久 | 丁香婷婷激情 | 国内av在线播放 | 丰满少妇中文字幕 | 久久人体视频 | 四虎永久地址 | 国产123区在线观看 91国产一区二区 | 嫩草视频91| 美女露胸露尿口 | 天天躁日日躁狠狠躁免费麻豆 | 久草新免费 | 亚洲综合色一区二区 | 久久久久亚洲精品 | 亚洲另类欧美日韩 | 青草视频在线免费观看 | 天堂av中文在线 | 男女激情在线观看 | 碰在线视频 | 日日骚一区二区 | 国产精品国产三级国产aⅴ浪潮 | 人妻体内射精一区二区三区 | a级片日本| 在线免费观看 | 美女被啪啪 | 91丨porny丨 | 爱爱激情网 | 精品一区久久 | 中文字幕久久一区 | 99国产精品人妻噜啊噜 | 少妇做爰免费视频播放 | 精品一区二区三区视频 | 黄色污污视频网站 | 久久99伊人| 国产女合集 | 国产精品美女www爽爽爽 | 日本三级吹潮 | 亚洲一区二区在线视频 | 制服丝袜av一区二区三区下载 | 99久久婷婷国产一区二区三区 | 男女一区二区三区 | 国内精品亚洲 | av作品在线观看 | 亚洲一区二区三区四区在线观看 | 亚洲精品乱码久久久久久国产主播 | 九七影院在线观看免费观看电视 | 欧美成人精品一区二区男人看 | 在线免费观看av网 | 亚洲视频免费 | 少妇高潮一69aⅹ | 久久久久久网站 | 精品人妻一区二区三区四区不卡 | 狠狠干性视频 | 中文字幕二区在线观看 | 日韩亚洲一区二区 | 中出 在线 | 国产网站精品 | 精品无码一区二区三区 | 成人国产精品入口免费视频 | 爱操av| 中文字幕日韩一区二区三区 | 日日干夜 | 97精品在线 |