日韩性视频-久久久蜜桃-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

總結

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

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

主站蜘蛛池模板: 黄色三级小视频 | 99久久亚洲精品日本无码 | 国产在线观看黄 | 黄色视屏在线免费观看 | www.黄色| 91视频在| 国产99久久久国产精品成人免费 | 日本免费黄色 | 麻豆乱淫一区二区三区 | 男人网站在线观看 | 久久久久国产精品午夜一区 | 五月天婷婷丁香 | 亚色91| 四虎影院永久地址 | 亚洲 日本 欧美 中文幕 | 亚洲视频1| 韩日视频一区 | 精品国产成人av | 密臀av在线| 中文字幕一二 | 天天干中文字幕 | 狠狠干av | 亚洲狼人色 | 性欧美丰满熟妇xxxx性仙踪林 | 久久精品国产亚洲av麻豆图片 | 午夜激情视频在线观看 | 人人爱av| 成年人视频在线看 | 狠狠操2019| 日韩av在线导航 | av一区二区三区在线观看 | 深夜成人福利视频 | 91影音 | 精品亚洲乱码一区二区 | 日韩欧美高清一区 | 国产福利免费视频 | 婷婷的五月 | 超碰国产一区二区三区 | 懂色av一区二区三区四区 | 久久精品成人av | 美女激情av| 丝袜国产在线 | 欧美日韩1区2区 | 99国产视频 | 免费的黄色网址 | 国产精品一线二线 | 天天天综合网 | 国产免费黄色大片 | 久久久久久一区 | 亚洲色图图 | www.激情.com | 天堂8av| 变态另类ts人妖一区二区 | 无码人妻丰满熟妇区五十路百度 | 黄色av网址在线观看 | 大白屁股一区二区视频 | 亚洲一区影视 | 超碰在线色 | 日本一区不卡视频 | 人妻洗澡被强公日日澡电影 | 国产乱码精品一区二区三区精东 | 三级电影网址 | 久久婷婷国产 | 精品一区二区视频 | 亚洲综合热 | 国产成人三级在线 | 精品久久久一区 | 国产香蕉在线 | 自拍视频在线观看 | 国产福利一区二区三区视频 | 在线观看黄色动漫 | 性插视频在线观看 | 波多野结衣一区二区三区 | 精品国产欧美一区二区三区成人 | 亚洲美女福利 | 日韩一区二区三区电影 | 天天射天天爽 | 一区av在线 | 久久色av| 91porn破解版 | www狠狠干 | 亚洲av毛片成人精品 | 久久久久香蕉 | 国产一区精品在线观看 | 射一射| 91成人福利在线 | 韩日视频在线 | 无人在线观看高清视频 | 日本一区二区三区在线视频 | 色激情网 | 粗口调教gay2022.com | 91亚洲国产成人精品一区二三 | 桃色av网站 | 日韩激情影院 | 久久亚洲av午夜福利精品一区 | 日韩免费观看一区二区三区 | 在线免费观看一级片 | 台湾佬在线| 九九热在线视频 |