二叉树的四种遍历(递归与非递归)
先序遍历与后序遍历
先序遍历根节点,再遍历左子树,再遍历右子树。
后序遍历先遍历左子树,再遍历右子树,再遍历根节点。
先序遍历递归实现: public static void preOrderByRecursion(TreeNode root) { // 打印节点值 System.out.println(root.value); preOrder(root.left); preOrder(root.right); }
先序遍历的非递归实现:
非递归实现需要借助栈这样一个数据结构,实际上递归实现也是依靠栈,只不过是隐式的。 先将根节点压入栈中。 弹出栈中的节点,将弹出节点的右子节点压入栈中,再将弹出节点的左子树压入栈中。 重复步骤2,直到栈为空。 public static void preOrder(TreeNode root) { if (root == null) { return; } Stack stack = new Stack<>(); stack.push(root); while (!stack.empty()) { TreeNode node = stack.pop(); // 打印节点值 System.out.print(node.value + " "); if (node.right != null) { stack.push(node.right); } if (node.left != null) { stack.push(node.left); } } }
后序遍历递归实现:先序遍历反过来,就不赘述了。 public static void postOrderByRecursion(TreeNode root) { postOrderByRecursion(root.left); postOrderByRecursion(root.right); System.out.println(root.value); }
后序遍历非递归实现:后序遍历就是先序遍历反过来,所以需要两个栈,多出来的栈用来反向输出。 public static void postOrder(TreeNode root) { if (root == null) { return; } Stack s1 = new Stack<>(); Stack s2 = new Stack<>(); s1.push(root); while (!s1.empty()) { TreeNode node = s1.pop(); s2.push(node); if (node.left != null) { s1.push(node.left); } if (node.right != null) { s1.push(node.right); } } while (!s2.empty()) { System.out.println(s2.pop().value); } } 中序遍历
中序遍历先遍历左子树,再遍历根节点,再遍历右子树。
递归遍历: public static void inOrderByRecursion(TreeNode root) { if (root == null) { return; } inOrderByRecursion(root.left); // 打印节点值 System.out.println(root.value); inOrderByRecursion(root.right); }
非递归遍历: 将二叉树的左侧"边"从上到下依次压入栈中。 从栈中弹出节点 对以弹出节点的右子节点为根节点的子树,重复步骤1。 重复2、3步骤,直到栈为空。 public static void inOrder(TreeNode root) { if (root == null) { return; } Stack stack = new Stack<>(); TreeNode cur = root; while (cur != null) { stack.push(cur); cur = cur.left; } while (!stack.empty()) { TreeNode node = stack.pop(); System.out.println(node.value); cur = node.right; while (cur != null) { stack.push(cur); cur = cur.left; } } } 层序遍历
层序遍历顾名思义就是一层一层,从左到右的遍历二叉树。需要用到队列这一数据结构。 将根节点推入队列。 从队列中取出一个节点。 先将取出节点的左子节点推入队列,再将取出节点的右子节点推入队列。 重复2、3步骤直到队列中无节点可取。 public static void floorOrder(TreeNode root) { if (root == null) { return; } Queue queue = new LinkedList<>(); queue.add(root); while (!queue.isEmpty()) { TreeNode node = queue.poll(); System.out.println(node.value); if (node.left != null) { queue.add(node.left); } if (node.right != null) { queue.add(node.right); } } }
重启MX梦想系列?魅族新款旗舰将至,比魅族18更强魅族科技前段时间复活了魅蓝品牌,作为魅族的子品牌,魅蓝曾推出了多款热门的中低端智能手机,并且也帮助魅族获得了两千万部的年销量不过由于利润相对较低,魅族放弃了魅蓝手机,魅族品牌的负责
你能接受没有网络吗?我来自农村没有网络很正常的事,许多老人都在用老年机,这么多年我从老年机用到4G手机,一直都很省。1。去年买了个5G手机,是因为去年因为疫情外出打工不易,厂里订单少,我们农民工又不敢
电动车事故频发,理想和小鹏改辅助驾驶文案自动改智能出品三言财经作者DorAemon今日,有网友发现,理想汽车官网里对辅助驾驶系统的名称做了改变。原理想官网辅助驾驶系统名称中包含高级二字现已将高级一词去除根据该网友上传的截图显示,理
国产屏正在崛起,三星神话破灭指日可待,OLED面板首次跌破70手机屏幕应该是现在智能手机唯二最被关注的配置,另外一个是相机。最近两年随着高刷屏被带火,手机厂商都开始在屏幕上发力。如果自家的旗舰机不在发布会上说耗费几个亿打磨一块屏幕,似乎显得自
Windowsmp3gain1。3。5c1。4汉化版mp3gain中文版是一款非常优秀的MP3音量平衡调整软件,这是经过我要汉化工作室所处理过的一个版本,因为源程序是默认英文语言的,而这对国人就十分的不友好,但是该软件又非常的好用,
realmeFlash,安卓首款磁吸无线充电手机本期内容应前几期粉丝留言投稿,所以小编带各位小伙伴来了解一下这款安卓首款磁吸无线充电手机!真我Flash这款手机性能方面,可能搭载了高通骁龙888plusLPDDR5UFS3。1,
iQOO8怎么样?iQOO8最新上市价格还未公布,上市时间为2021年08月4日。这款手机多款配色十分吸睛,颜值相当耐打。首先,我们关注屏幕方面,屏幕尺寸为6。56英寸。分辨率为24001080,屏
手机屏幕触控失灵,那是这几点没有做好点亮好奇心在我们生活当中的一些使用习惯,对手机屏幕的寿命也会有着很大的影响,如果想要让自己的手机屏幕一直保持在正常状态的话,在平时要避开一些坏习惯,接下来跟大家讲解在平时会做出一些
1000兆宽带手机测速应该达到多少?先确认是否真千兆网速,999M四舍五入也能叫千兆,但那还是百兆网速。真千兆需用万兆光猫,甪千兆双频猫的都是百兆网。测速需运营商师傅当面上设备或使用运营商指定测速软件才能测准,而且必
父亲想把旧电脑给女儿,女儿却说父亲偏心,父亲有钱自己买都说穷养儿子富养女,这句话的意思就是说女儿要富着养,儿子要穷着养,事实上也并不一定,这个跟孩子的生存环境有关家庭条件有关家庭规矩有关,就在今天,我就碰到了一位父亲带着女儿过来修电脑
资讯丨京东方联手OPPO发布下一代屏下摄像头技术,真400PPI加持全面屏是手机发展的大趋势,屏下摄像头技术则被誉为全面屏手机的终极解决方案。有媒体表示,2022年或将是屏下摄像头进入主流的一年。近日,在OPPO未来影像技术发布会上,OPPO携手B