打印完全二叉树java_java 完全二叉树的构建与四种遍历方法示例

本来就是基础知识,不能丢的太干净,今天竟然花了那么长的时间才写出来,记一下。

有如下的一颗完全二叉树:

c72dbb1c6ef3ef13e2a12e6ec49ab597.png

先序遍历结果应该为:1  2  4  5  3  6  7

中序遍历结果应该为:4  2  5  1  6  3  7

后序遍历结果应该为:4  5  2  6  7  3  1

层序遍历结果应该为:1  2  3  4  5  6  7

二叉树的先序遍历、中序遍历、后序遍历其实都是一样的,都是执行递归操作。

我这记录一下层次遍历吧:层次遍历需要用到队列,先入队在出队,每次出队的元素检查是其是否有左右孩子,有则将其加入队列,由于利用队列的先进先出原理,进行层次遍历。

下面记录下完整代码(Java实现),包括几种遍历方法:

import java.util.ArrayDeque;

import java.util.ArrayList;

import java.util.List;

import java.util.Queue;

/**

* 定义二叉树节点元素

* @author bubble

*

*/

class Node {

public Node leftchild;

public Node rightchild;

public int data;

public Node(int data) {

this.data = data;

}

}

public class TestBinTree {

/**

* 将一个arry数组构建成一个完全二叉树

* @param arr 需要构建的数组

* @return 二叉树的根节点

*/

public Node initBinTree(int[] arr) {

if(arr.length == 1) {

return new Node(arr[0]);

}

List nodeList = new ArrayList<>();

for(int i = 0; i < arr.length; i++) {

nodeList.add(new Node(arr[i]));

}

int temp = 0;

while(temp <= (arr.length - 2) / 2) { //注意这里,数组的下标是从零开始的

if(2 * temp + 1 < arr.length) {

nodeList.get(temp).leftchild = nodeList.get(2 * temp + 1);

}

if(2 * temp + 2 < arr.length) {

nodeList.get(temp).rightchild = nodeList.get(2 * temp + 2);

}

temp++;

}

return nodeList.get(0);

}

/**

* 层序遍历二叉树,,并分层打印

* @param root 二叉树根节点

*

*/

public void trivalBinTree(Node root) {

Queue nodeQueue = new ArrayDeque<>();

nodeQueue.add(root);

Node temp = null;

int currentLevel = 1; //记录当前层需要打印的节点的数量

int nextLevel = 0;//记录下一层需要打印的节点的数量

while ((temp = nodeQueue.poll()) != null) {

if (temp.leftchild != null) {

nodeQueue.add(temp.leftchild);

nextLevel++;

}

if (temp.rightchild != null) {

nodeQueue.add(temp.rightchild);

nextLevel++;

}

System.out.print(temp.data + " ");

currentLevel--;

if(currentLevel == 0) {

System.out.println();

currentLevel = nextLevel;

nextLevel = 0;

}

}

}

/**

* 先序遍历

* @param root 二叉树根节点

*/

public void preTrival(Node root) {

if(root == null) {

return;

}

System.out.print(root.data + " ");

preTrival(root.leftchild);

preTrival(root.rightchild);

}

/**

* 中序遍历

* @param root 二叉树根节点

*/

public void midTrival(Node root) {

if(root == null) {

return;

}

midTrival(root.leftchild);

System.out.print(root.data + " ");

midTrival(root.rightchild);

}

/**

* 后序遍历

* @param root 二叉树根节点

*/

public void afterTrival(Node root) {

if(root == null) {

return;

}

afterTrival(root.leftchild);

afterTrival(root.rightchild);

System.out.print(root.data + " ");

}

public static void main(String[] args) {

TestBinTree btree = new TestBinTree();

int[] arr = new int[] {1,2,3,4,5,6,7};

Node root = btree.initBinTree(arr);

System.out.println("层序遍历(分层打印):");

btree.trivalBinTree(root);

System.out.println("\n先序遍历:");

btree.preTrival(root);

System.out.println("\n中序遍历:");

btree.midTrival(root);

System.out.println("\n后序遍历:");

btree.afterTrival(root);

}

}

遍历结果:

1a09315819877f62bf64da381b81ae3d.png

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/503902.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模拟 http connecttimeout_燃烧室数学模型模拟软件NPSS

燃烧室的各个结构都可以被建立数学模型用矩阵进行模拟计算&#xff0c;每个模型都由输入、定义各部件的参数以及输出组成。流体在系统中某个点的状态可以由速率、压力、温度和构成(例如铝粉和氢气的质量比例)等参数描述。由于各个参数之间存在反馈环路&#xff0c;导致输入和输…

两个时间点距离 time_t c_天津二建公路考试时间

天津二建公路考试时间 Vadg42d天津二建公路考试时间 预警体系通过预警分析和预控对策实现事故的预警和控制&#xff0c;预警分析完成监测、识别、诊断与评价功能&#xff0c;而预控对策完成对事故征兆的不良趋势进行纠错和治错的功能。技术方案现金流量表主要有投资现金流量表&…

java 168转换成861_java实验-java语言面向对象编程基础

java实验-java语言面向对象编程基础 (12页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;8.90 积分广州大学学生实验报告广州大学学生实验报告开课学院及实验室&#xff1a;开课学院及实验室&#xf…

c#养老院老人信息管理系统源码 论文_辽宁吃的好的社区养老院位置,爱心养老院_抚顺市望花区社会养老中心...

首页 > 新闻中心发布时间&#xff1a;2020-11-09 02:11:16 导读&#xff1a;抚顺市望花区社会养老中心为您提供辽宁吃的好的社区养老院位置,爱心养老院的相关知识与详情&#xff1a; 老人早晨气场后手指经常发硬&#xff0c;无法自己握拳。 老人关节活动不方便&#xff0c;活…

名片识别信息分类python_python体验名片识别OCR

我想使用名片识别OCR&#xff0c;主要研究了腾讯云的智能映像和腾讯Youtu.解析后的汉字直接是unicode&#xff0c;例如u\ u90e8 \ u95e8 \ u526f \ u603b \ u7ecf \ u7406&#xff0c;根据腾讯的文档&#xff0c;代码经验:首先&#xff0c;介绍一下.import timeimport randomim…

SQL进阶:子查询

一般情况下,我们都是直接对表进行查询,但有时候,想要的数据可能通过一次select 获取不到,需要嵌套select,这样就形成了子查询。 子查询可以位于查询语句的任意位置,主要的注意点在于用于不同的位置,和不同的关键字一起使用时,需要注意返回的列的数量和行的数量。 位于…

python3单例-python3如何运行文件夹python单例模式

单例模式是一种常用的软件设计模式. 在单例模式的核心结构中,只包含一个被称为单例类的特殊类. 通过单例模式可以保证系统中一个类只有一个实例,而且这个实例可以轻易被外界访问,方便控制实例对象的个数以节约系统资源. 单例模式是解决一个系统中某个类的实例化对象有且只能有一…

python json解析 超过对象_json序列化数据超出最大值(maxJsonLength)

标签&#xff1a;1、序列化&#xff1a;以下代码在对象过大时会报错&#xff1a;进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength 属性设置的值。//jsonObj比较大的时候会报错var serializer new JavaScriptSerializer();return serializer.Serialize(jsonOb…

native 真机测试react_react-native真机调试出现Failed to install all

使用的魅蓝note手机进行调试&#xff0c;没有想到就出现这个问题了。错误信息&#xff1a;Installing APK app-debug.apk on m1 note - 5.1 for app:debugUnable to install H:\ReactN\one\android\app\build\outputs\apk\app-debug.apkcom.android.ddmlib.InstallException: F…

android四周阴影效果_帮助独立开发者轻松创建令人惊叹的产品视觉效果

大家好&#xff0c;我是独立开发者Larry&#xff5e;作品发布、宣传交流过程中对作品进行样机包装或场景展示往往是不可或缺的&#xff0c;除了纯手工打造外&#xff0c;通常大家都会运用一些样机素材来完成对产品的快速包装&#xff0c;因此关于样机素材的资源网上有很多&…

python3 gui tk代码_【基础】学习笔记30-python3 tkinter GUI编程-实操12

import tkinter as tkwin tk.Tk()menu tk.Menu(win) # 创建顶层菜单filemenu tk.Menu(menu, tearoff0) # 创建二级菜单def printIterm():print(vPython, vPython.get())print(vPHP, vPHP.get())print(vCPP, vCPP.get())print(vC, vC.get())print(vJava, vJava.get())vPyth…

pythonweb全栈开发_Web全栈开发穿插路程(python+js)

简介&#xff1a;穿插路程&#xff0c;是指快去快回&#xff0c;来去一阵风&#xff0c;走的快&#xff0c;走马观花&#xff0c;没有细品。细品那就要慢慢熬功夫喽。1.完成后的效果是&#xff1a;用户访问入口页面&#xff0c;录入信息&#xff0c;提交后结果以逐步添加的形式…

C++和Rust_Kotlin、Rust两个充满了骚操作的编程语言,值得一玩

Kotlin和Rust都是两个年轻的编程语言&#xff0c;而且相比现在流行的Python、JavaScript/Typescript语言来说&#xff0c;Kotlin和Rust更接近底层&#xff0c;对于学习理解计算机原理&#xff0c;学习Kotlin和Rust应该是更好的选择。与C/C相比&#xff0c;Kotlin、Rust做上层应…

vue 渲染函数处理slot_vue render 渲染函数

vue render 渲染函数经常看到使用render渲染函数的示例&#xff0c;而且在一些特殊情况下&#xff0c;确实更好使用&#xff0c;可以更加有效地细分组件&#xff0c;因而借助vue-element-admin来学习一波render函数分析函数式组件基础的使用方式Link.vue// https://github.com/…

理发店管理系统java_美容美发店管理系统的设计与实现(JSP,SQLServer)(含录像)

美容美发店管理系统的设计与实现(,SQLServer)(含录像)(开题报告,论文12700字,程序代码,SQLServer数据库)系统功能结构本系统是根据我国美容业的现状及中小型美容院的发展需要进行详细的分析&#xff0c; 对美容院信息管理系统进行合理的设计&#xff0c; 实现集成员工管理、工资…

cpu频率_新版win10修复CPU频率显示不正确的bug

在此前win10 2020年5月更新后&#xff0c;有用户反馈win10任务管理器无法正确显示CPU使用率和频率&#xff0c;比如会出现CPU频率为0.00GHz。现在有外媒报道&#xff0c;微软在win10测试版19042.608中修复了CPU频率显示不正确的bug。这一消息也得到了微软的确认表示已经修复了某…

sap fiori导出列表到excel_介绍一种Fiori标准应用的增强方式

2015年&#xff0c;Jerry还在SAP成都研究院CRM Fiori开发团队工作时&#xff0c;担任了德国一个著名的灯具制造商客户的CRM Fiori项目的dev angel. 当时客户提出了若干对CRM Fiori标准应用的增强需求&#xff0c;总的来说分为前台Fiori UI界面的增强(比如增添新的自定义字段)以…

打桩时不修改源码_考研网上报名点了修改报名,修改后到报名点时,出现部分信息不符合参考条件,请修改或重新报名...

展开全部用户直接填写2113页面底部的黄色显示5261的验证码信息后4102&#xff0c;点击确认1653无误按钮&#xff0c;完成专报名操作&#xff0c;再修改相关信属息即可。但招生单位、考试方式和报考点几项不允许修改&#xff0c;若填写错误&#xff0c;只能再新增一份新的报名信…

ios 图片居中裁剪_[ iOS Shortcuts / Workflow ] 分享一个给照片批量加「底部居中偏上」水印的捷径,可适应不同水印的尺寸...

首先放链接效果示意图捷径特点本捷径的水印位置位于图片底部局中偏上的位置可自适应不同水印的尺寸可多选照片批量操作在加水印操作完成后会弹出预览&#xff0c;完成后点击保存或放弃选择保存后还可选择是否删除原图受益于捷径 app 本身&#xff0c;加水印后的图片分辨率、拍摄…

java检测kafka是否连接成功,kafka代码测试连接

1.发送&#xff1a;package kafka.test;import java.util.Date;import java.util.Properties;import java.util.Random;import kafka.javaapi.producer.Producer;import kafka.producer.KeyedMessage;import kafka.producer.ProducerConfig;public class KafkaProduct {public …