全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

详解java实现遍历二叉树的三种情况

遍历二叉树,从上往下遍历。但是同层节点可以从左向右遍历,也可以从右向左遍历(也就是之字型遍历),其中,都需要队列进行实现。只是按照之字型稍微麻烦一些。

(1)从上往下打印出二叉树的每个节点,同层节点从左至右打印。

需要一个队列,队列里面放节点(从根节点开始),然后依次进行打印。

import java.util.ArrayList;
import java.util.Queue;
import java.util.LinkedList;
class TreeNode{
 int val = 0;
 TreeNode left = null;
 TreeNode right = null;

 public TreeNode(int val){
  this.val = val;
 }
}

public class Solution {
  public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
   ArrayList<Integer> list = new ArrayList<Integer>();
   if(root == null) 
    return list;
   Queue<TreeNode> queue = new LinkedList<TreeNode>();

   queue.add(root);
   while(!queue.isEmpty()){
    TreeNode t = queue.poll();
    list.add(t.val);
    if(t.left != null) queue.add(t.left);
    if(t.right != null) queue.add(t.right);
   }
   return list;
  }
}

(2)请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

解析:之字形打印二叉树,不要将所有层放入ArrayList中后再将偶数层进行reverse(),这样可以实现,但是数据量大的时候效率太低。

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
 class TreeNode {
 int val = 0;
 TreeNode left = null;
 TreeNode right = null;

 public TreeNode(int val) {
  this.val = val;

 }

}

public class Solution {
 public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
  ArrayList<ArrayList<Integer>> result=new ArrayList<ArrayList<Integer>>();
  if(pRoot==null){
   return result;
  }

  Queue<TreeNode> queue = new LinkedList<TreeNode>();
  int rows=1;
  queue.add(pRoot);
  while(!queue.isEmpty()){
   ArrayList<Integer> list=new ArrayList();
   int size=queue.size();
   for(int i=0;i<size;i++){
    TreeNode t=queue.poll();
    if(rows%2==0){
     list.add(0,t.val); //将元素插入指定位置(头部),也就相当于倒序了
    }else{
     list.add(t.val); //将元素插入尾部
    }
    if(t.left!=null){
     queue.offer(t.left);
    }
    if(t.right!=null){
     queue.offer(t.right);
    }
   }
   result.add(list);
   rows++;
  }
  return result;

 }

}

(3)从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

这道题就是典型的二叉树层次遍历。

思路:因为我们要按层打印,所以需要设置标志量。

其次:我们需要三个集合:

第一个集合用于存放结果集

第二个集合用于临时存放每一层的结果,等到一层结束之后,再将其加入到最终结果集中。注意,每一次使用完这个集合之后,需要将其清空,以便下一次存放。

第三个集合用于存放节点。

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.*;

class TreeNode
{
 int val = 0;
 TreeNode left = null;
 TreeNode right = null;

 public TreeNode(int val)
 {
  this.val = val;

 }

}

public class Solution
{
 ArrayList<ArrayList<Integer>> Print(TreeNode pRoot)
 {

  ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();

  ArrayList<Integer> arrayList = new ArrayList<Integer>();

  Queue<TreeNode> queue = new LinkedList<TreeNode>(); // 存放节点

  // 检查是否为空
  if (pRoot == null)
   return result;

  queue.add(pRoot);

  int start = 0;
  int end = 1; // 第一行

  while (!queue.isEmpty())
  {
   TreeNode treeNode = queue.poll();
   end--;
   arrayList.add(treeNode.val);

   if (treeNode.left != null) // 如果有左节点
   {
    queue.add(treeNode.left);// 将左节点加入linkedList中
    start++; // 标志进入下一行
   }
   if (treeNode.right != null)
   {
    queue.add(treeNode.right);
    start++; // 标志进入下一行
   }

   if (end == 0)
   { // 此时也就是说明把一层已经打印完了,应该将其加入结果集中
    result.add(new ArrayList<Integer>(arrayList)); // 加入结果集中
    arrayList.clear();// 必须将临时存放结果的集合清空,以便进行下一次存放
    end = start; // 恢复原状
    start = 0;

   }

  }

  return result;

 }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# java实现二叉树的遍历  # 二叉树遍历  # java  # java二叉树遍历算法  # java实现二叉树遍历的三种方式  # Java二叉树的遍历思想及核心代码实现  # Java实现二叉树的深度优先遍历和广度优先遍历算法示例  # Java实现的二叉树常用操作【前序建树  # 前中后递归非递归遍历及层序遍历】  # Java中二叉树的建立和各种遍历实例代码  # Java完全二叉树的创建与四种遍历方法分析  # 图解二叉树的三种遍历方式及java实现代码  # java实现二叉树的创建及5种遍历方法(总结)  # java 完全二叉树的构建与四种遍历方法示例  # java实现按层遍历二叉树  # 遍历  # 二叉树  # 将其  # 字型  # 往下  # 再将  # 清空  # 第一个  # 也就  # 以此类推  # 第二个  # 之字形  # 可以实现  # 要将  # 第三个  # 量大  # 太低  # 这道  # 大家多多  # 为空 


相关文章: 建站之星各版本价格是多少?  名字制作网站免费,所有小说网站的名字?  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  建站主机服务器选购指南:轻量应用与VPS配置解析  制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?  北京制作网站的公司,北京铁路集团官方网站?  岳西云建站教程与模板下载_一站式快速建站系统操作指南  如何在Golang中指定模块版本_使用go.mod控制版本号  建站之星安装提示数据库无法连接如何解决?  黑客如何利用漏洞与弱口令入侵网站服务器?  如何在自有机房高效搭建专业网站?  韩国服务器如何优化跨境访问实现高效连接?  制作网站的过程怎么写,用凡科建站如何制作自己的网站?  制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?  如何快速生成凡客建站的专业级图册?  如何解决VPS建站LNMP环境配置常见问题?  建站主机与服务器功能差异如何区分?  如何在IIS管理器中快速创建并配置网站?  一键网站制作软件,义乌购一件代发流程?  如何在服务器上三步完成建站并提升流量?  微网站制作教程,我微信里的网站怎么才能复制到浏览器里?  网站建设设计制作营销公司南阳,如何策划设计和建设网站?  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  制作国外网站的软件,国外有哪些比较优质的网站推荐?  制作网页的网站有哪些,电脑上怎么做网页?  外贸公司网站制作哪家好,maersk船公司官网?  网站制作的方法有哪些,如何将自己制作的网站发布到网上?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  ,sp开头的版面叫什么?  如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法  建站之星代理费用多少?最新价格详情介绍  内网网站制作软件,内网的网站如何发布到外网?  建站之星如何修改网站生成路径?  如何确保FTP站点访问权限与数据传输安全?  建站之星安装模板失败:服务器环境不兼容?  5种Android数据存储方式汇总  如何快速建站并高效导出源代码?  如何高效配置香港服务器实现快速建站?  再谈Python中的字符串与字符编码(推荐)  如何快速查询域名建站关键信息?  如何选择可靠的免备案建站服务器?  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何选择高效响应式自助建站源码系统?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  怀化网站制作公司,怀化新生儿上户网上办理流程?  网站制作的步骤包括,正确网址格式怎么写? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。