手写二叉树-先序构造(泛型)-层序遍历(Java版)
如题
- 先序构造
- 数据类型使用了泛型,在后续的更改中,更换数据类型只需要少许的变更代码
- 层序遍历
- 利用Node类的level属性
- 所有属性的权限全为public ,为了方便先这么写吧,建议还是用private来写.
- 还有个问题,值得注意, 就是先序构造的时候注意传入的root节点是形参, 无论通过"."还是"get"方法得到的属性都是形参;
- 因此, 要在函数中添加返回体--返回相应修改后的字段,进行覆盖.

- 因此, 要在函数中添加返回体--返回相应修改后的字段,进行覆盖.
Node.java
package com.szs;
/**
* @description 描述二叉树的每个节点的类
* @author Administrator
*
* @param <T> 设置泛型
*/
public class Node<T>{
//数据data 和 左右儿子 ,level: 层级数
public Node lChild;
public Node rChild;
public T data;
public int level;
//两种构造器
public Node(){
data = null;
lChild=null;
rChild=null;
}
public Node(T x){
data = x;
lChild=new Node();
rChild=new Node();
}
}
BinaryTree.java
package com.szs;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Scanner;
/**
* @description 描述二叉树的每种操作方法的类,创建/
* @author Administrator
*
* @param <T> 设置泛型
*/
public class BinaryTree<T> {
//二叉树的根节点
public Node<T> root;
//两种构造器
//创建一棵以数据元素为根节点的二叉树
public BinaryTree(T x) {
this.root = new Node<T>(x);
}
//创建一空的二叉树,但需要初始化根节点,相当于C语言中的分配内存空间
public BinaryTree() {
//this.root = null; //错误写法
this.root = new Node<T>();
}
/**为先序序列的构建提供数据*/
public LinkedList<Integer> array;
//先序构造一棵二叉树, 迭代构造
@SuppressWarnings("unchecked")
public <T> Node<T> preOrderBuild(Node<T> rootNode){
if(rootNode==null){
return null;
}
/*从队首取出一个数据,然后删除*/
int value = (Integer) array.get(0);
array.removeFirst();
if(value!=-1){
//构建当前根节点 , 注意这里的泛型
rootNode = (Node<T>) new Node<Integer>(value);
//迭代构建左右子树
rootNode.lChild = preOrderBuild(rootNode.lChild);
rootNode.rChild = preOrderBuild(rootNode.rChild);
}
return rootNode;
}
//层次遍历该树,迭代输出,非递归
public <T> void levelRetrieve(){
//建立列表
List<Node> list = new LinkedList<Node>();
if(this.root!=null){
this.root.level=0;
list.add(this.root);
}
int i=0;
while(i<list.size()){
int level = list.get(i).getLevel();
Node node = list.get(i);
if(node.lChild!=null){
node.lChild.level = level+1;
list.add(node.lChild);
}
if(node.rChild!=null){
node.rChild.level = level+1;
list.add(node.rChild);
}
//顺序遍历
i++;
}
//层级输出
System.out.println("---------层级输出-----------");
for(int j=0;j<list.size();j++){
if(list.get(j).data!=null){
System.out.print(list.get(j).data);
}
if(j<list.size()-1 && list.get(j).level==list.get(j+1).level){
System.out.print("\t");
}else{
System.out.print("\n");
}
}
}
}
TestBinaryTree.java 主测试二叉树的类
package com.szs;
import java.util.LinkedList;
import java.util.Scanner;
public class TestBinaryTree {
public static void main(String[] args) {
//构造
BinaryTree<Integer> binaryTree = new BinaryTree<Integer>(null);
//先序创建二叉树 , 如下提供了三组简单数据
// 1 2 -1 -1 3 4 -1 -1 -1
// 1 2 -1 -1 3 -1 -1
// 1 2 -1 -1 -1
init(binaryTree);
binaryTree.root = binaryTree.preOrderBuild(binaryTree.root);
//层序
binaryTree.levelRetrieve();
}
/**
* 初始化构造二叉树数据的数组
* @param binaryTree
*/
public static void init(BinaryTree<Integer> binaryTree){
System.out.println("请输入该二叉树先序构造的数组序列(以单个空格隔开): ");
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
String[] arrStrings=str.trim().split(" ");
LinkedList<Integer> intArr = new LinkedList<Integer>();
for(int i=0;i<arrStrings.length;i++){
intArr.add( Integer.parseInt( arrStrings[i]));
}
binaryTree.array=intArr;
}
}
先序构造测试及相关输出

请输入该二叉树先序构造的数组序列(以单个空格隔开):
1 2 -1 -1 3 4 -1 -1 -1
---------层级输出-----------
1
2 3
4
手写二叉树-先序构造(泛型)-层序遍历(Java版)的更多相关文章
- 后序线索化二叉树(Java版)
前面介绍了前序线索化二叉树.中序线索化二叉树,本文将介绍后序线索化二叉树.之所以用单独的一篇文章来分析后序线索化二叉树,是因为后序线索化二叉树比前序.中序要复杂一些:另外在复习线索化二叉树的过程中,大 ...
- 手写Spring MVC框架(一) 实现简易版mvc框架
前言 前面几篇文章中,我们讲解了Spring MVC执⾏的⼤致原理及关键组件的源码解析,今天,我们来模仿它⼿写⾃⼰的mvc框架. 先梳理一下需要实现的功能点: tomcat加载配置文件web.xml: ...
- 【剑指offer】不分行从上到下打印二叉树,C++实现(层序遍历)
原创文章,转载请注明出处! 本题牛客网地址 博客文章索引地址 博客文章中代码的github地址 1.题目 从上往下打印出二叉树的每个节点,同层节点从左至右打印.例如: 图 不分行从上往下按层打印二叉 ...
- PAT Advanced 1127 ZigZagging on a Tree (30) [中序后序建树,层序遍历]
题目 Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree c ...
- 二叉树(前序,中序,后序,层序)遍历递归与循环的python实现
二叉树的遍历是在面试使比较常见的项目了.对于二叉树的前中后层序遍历,每种遍历都可以递归和循环两种实现方法,且每种遍历的递归实现都比循环实现要简洁.下面做一个小结. 一.中序遍历 前中后序三种遍历方法对 ...
- 二叉树的查找(前序、中序、后序、层序遍历)--biaobiao88
建立一棵含有n个结点的二叉树,采用二叉链表存储: 输出前序.中序.后序..层序遍历该二叉树的遍历结果. 定义二叉树的数据类型——二叉树结点结构体BiNode.建立二叉链表可以采用扩展二叉树的一个遍历序 ...
- 【Java】 二叉树的遍历(递归与循环+层序遍历)
在[Java] 大话数据结构(9) 树(二叉树.线索二叉树)一文中,已经实现了采用递归方法的前.中.后序遍历,本文补充了采用循环的实现方法.以及层序遍历并进行了一个总结. 递归实现 /* * 前序遍历 ...
- 手写一个简单的HashMap
HashMap简介 HashMap是Java中一中非常常用的数据结构,也基本是面试中的"必考题".它实现了基于"K-V"形式的键值对的高效存取.JDK1.7之前 ...
- JAVA下实现二叉树的先序、中序、后序、层序遍历(递归和循环)
import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import java.util.Queue; ...
随机推荐
- (记录问题)1.Canvas.drawArc()方法的问题
先看看异常: 一眼看去就知道说的是方法找不到错误 后面发现是系统版本过低,4.0的系统找不到5.0后添加的方法报的错. 修改后完美解决
- Dockerfile常用指令说明
具体解释:https://blog.csdn.net/achenyuan/article/details/80231922 将dockerfile文件和生成好的jar 使用ftp工具上传到linux服 ...
- Symfony框架笔记
控制器获取前端传入的参数 $parameters = $request->request; $data = $parameters->all(); 引用静态资源(js.css.img) 使 ...
- day15——有参装饰器、多个装饰器装饰一个函数
day15 装饰器的进阶 有参装饰器 @auth(chose) 相等于以下两行代码的解构 wrapper = auth(chose) foo = wrapper(foo) # dic = {'user ...
- Django框架之第六篇(模型层)--单表查询和必知必会13条、单表查询之双下划线、Django ORM常用字段和参数、关系字段
单表查询 补充一个知识点:在models.py建表是 create_time = models.DateField() 关键字参数: 1.auto_now:每次操作数据,都会自动刷新当前操作的时间 2 ...
- Python之路【第二十九篇】:django ORM模型层
ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的 ...
- SSM整合学习 四
事务管理 一:初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个 ...
- 2019-07-23 php魔术方法
本文对一些php中的魔术方法进行总结,魔术方法顾名思义就是具备神奇功能的方法(function).魔术方法通常在某些特定情况下自动触发,不能用实例化变量名->方法名()来主动触发.不同的魔术方法 ...
- python day 17: UML(统一建模语言)
python day 17 UML:unified modeling languages,是一种基于面向对象的可视化建模语言. 画图语言:画图要合理.即符合逻辑. 历史: 3.1. 软件功能越来越强大 ...
- 【TBarCode SDK教程】TBarCode SDK 如何在 Microsoft Office 中工作?
使用条形码软件组件 TBarCode SDK,你可以在 Microsoft Office 中快速且简便地创建各种条形码.都不需要任何编程的技巧,只需要点击几次鼠标就可以将TBarCode SDK集成到 ...