java 二叉树的高度_Java实现二叉树的建立、计算高度与递归输出操作示例
本文实例讲述了java实现二叉树的建立、计算高度与递归输出操作。分享给大家供大家参考,具体如下:
1. 建立 递归输出 计算高度 前中后三种非递归输出 public class Tree_Link {
private int save = 0;
private int now = 0;
Scanner sc = new Scanner(System.in);
/*
* 构造函数
*/
Tree_Link(){
}
/*
* 链表建立
*/
public Tree Link_Build(Tree head){
// Tree head = new Tree();//头节点
System.out.println("继续code:1");
int flag = sc.nextInt();
if(flag != 1){
return head;
}else{
System.out.println("\n\n\n输入 节点信息:");
head.SetCode(sc.nextInt());
System.out.println("\n建立 左 子树code:1 否则:0");
flag = sc.nextInt();
if(flag == 1){
now++;
Tree LTree = new Tree();
head.SetLtree(LTree);
LTree.SetFronttree(head);//设置父母节点
Link_Build( head.GetLtree() );
}
System.out.println("\n当前位置:" + head.GetCode());
System.out.println("\n建立 右 子树code:1 否则:0");
flag = sc.nextInt();
if(flag == 1){
now++;
Tree Rtree = new Tree();
head.SetRtree(Rtree);
Rtree.SetFronttree(head);//设置父母节点
Link_Build( head.GetRtree() );
}
if( now > save ){
save = now;
}
now--;
}
return head;
}
/*
* 输出树
*/
public Tree output(Tree head){
int flag;
if(head.GetCode() == -1){
return head;
}else{
System.out.println("\n当前位置:" + head.GetCode());
System.out.println(head.GetLtree() != null);
if(head.GetLtree() != null){
System.out.println("\n访问 左子树:");
output( head.GetLtree() );
}
if(head.GetRtree() != null){
System.out.println("\n访问 右子树:");
output( head.GetRtree() );
}
}
return head;
}
/*
* 获得高度
*/
public int GetSave(){
return this.save;
}
/*
* 非递归 前序遍历
*/
public void Front_Traverse(Tree head){
Tree star = head;//退出标记
int choose = 1; //左
int flag = 1; //右
System.out.println( "" + head.GetCode() );//先访问根
while(true){
if( head.GetLtree() != null && choose != 0 ){
head = head.GetLtree();
System.out.println( "" + head.GetCode() );//获得信息
flag = 1;
}else if( head.GetRtree() != null && flag != 0 ){
head = head.GetRtree();
System.out.println( "" + head.GetCode() );
choose = 1;
}else if( flag == 0 && choose == 0 && head == star){
break;
}else{
if(head == head.GetFronttree().GetRtree()){
flag = 0;
choose = 0;
}
if(head == head.GetFronttree().GetLtree()){
choose = 0;
flag = 1;
}
head = head.GetFronttree();
System.out.println("获得 父母" + head.GetCode());
System.out.println( "\n\n\n" );
}
}
}
/*
* 非递归 中序遍历
*/
public void Center_Traverse(Tree head){
Tree star = head;//退出标记
int choose = 1; //左
int flag = 1; //右
while(true){
if( head.GetLtree() != null && choose != 0 ){
head = head.GetLtree();
flag = 1;
}else if( head.GetRtree() != null && flag != 0 ){
if(head.GetLtree() == null){//因为左边为空而返回
System.out.println( "" + head.GetCode());
}
head = head.GetRtree();
choose = 1;
}else if( flag == 0 && choose == 0 && head == star){
break;
}else{
int area = 0;//判断哪边回来
flag = 1;
choose = 1;
if(head == head.GetFronttree().GetRtree()){
area = 1;//右边回来
flag = 0;
choose = 0;
}
if(head == head.GetFronttree().GetLtree()){
area = 2;//左边回来
choose = 0;
flag = 1;
}
if( head.GetLtree() == null && head.GetRtree() == null ){//因为左边为空而返回
System.out.println( "" + head.GetCode());
}
head = head.GetFronttree();
if( area == 2){//因为左边访问完返回
System.out.println( "" + head.GetCode());
}
System.out.println("获得 父母" + head.GetCode());
System.out.println( "\n\n\n" );
}
}
}
/*
* 非递归 后续遍历
*/
public void Bottom_Traverse(Tree head){
Tree star = head;//退出标记
int choose = 1; //左
int flag = 1; //右
while(true){
if( head.GetLtree() != null && choose != 0 ){
head = head.GetLtree();
flag = 1;
}else if( head.GetRtree() != null && flag != 0 ){
head = head.GetRtree();
choose = 1;
}else if( flag == 0 && choose == 0 && head == star){
break;
}else{
int area = 0;//判断哪边回来
flag = 1;
choose = 1;
if(head == head.GetFronttree().GetRtree()){
area = 1;//右边回来
flag = 0;
choose = 0;
}
if(head == head.GetFronttree().GetLtree()){
choose = 0;
flag = 1;
}
if(head.GetRtree() == null){//因为右边为空而返回
System.out.println( "" + head.GetCode());
}
head = head.GetFronttree();
if( area == 1){
System.out.println( "" + head.GetCode());
}
System.out.println("获得 父母" + head.GetCode());
System.out.println( "\n\n\n" );
}
}
}
}
2. Tree 类实现: public class Tree {
private int code = -1;
private Tree Fonttree;
private Tree Ltree;
private Tree Rtree;
Tree(){
this.code = -1;
this.Ltree = null;
this.Rtree = null;
}
/*
* 树内容查看方法:
*/
public void SetCode(int code){//设置编号
this.code = code;
}
public int GetCode(){ //获取编号
return this.code;
}
/*
* 设置父母指针:
*/
public void SetFronttree(Tree Front){
this.Fonttree = Front;
}
public Tree GetFronttree(){
System.out.println("获得 父母");
return this.Fonttree;
}
/*
* 设置左子女:
*/
public void SetLtree(Tree Ltree){
this.Ltree = Ltree;
}
public Tree GetLtree(){
System.out.println("获得左子树");
return this.Ltree;
}
/*
* 设置右子女:
*/
public void SetRtree(Tree Rtree){
this.Rtree = Rtree;
}
public Tree GetRtree(){
System.out.println("获得右子树");
return this.Rtree;
}
}
3. 主函数测试: public class MainActivity {
Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
Tree head = new Tree();
Tree_Link link_1st = new Tree_Link();
head = link_1st.Link_Build(head);
System.out.println("Build succeed !");
System.out.println("\n二叉树高度-->" + link_1st.GetSave());
link_1st.output(head);
System.out.println("Output Over !");
System.out.println("\n\n\n前序访问根:");
link_1st.Front_Traverse(head);
System.out.println("\n\n\n中序访问根:");
link_1st.Center_Traverse(head);
System.out.println("\n\n\n后序访问根:");
link_1st.Bottom_Traverse(head);
System.out.println("\n\n\n\nText over !\n\n\n");
}
}
更多关于Java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
java 二叉树的高度_Java实现二叉树的建立、计算高度与递归输出操作示例相关推荐
- java二叉树是什么_java数据结构二叉树是什么?特点是?
二叉树是什么?学习java的小伙伴可能经常会听到这个词,但具体是什么又不可知,下面小编就来带你详细了解下二叉树. 二叉树概念 二叉树,指计算机中的一种树结构,这种树结构中每个结点至多只有两个子树,它们 ...
- java 二叉树的高度_java – 二叉树的高度
if (node == null) { return 0; } 叶节点的子节点为空.因此,这就是说,一旦我们过了叶子,没有更多的节点. 如果我们不经过叶节点,我们必须计算高度,并且这个代码这样递归. ...
- java遍历树结构数据_Java数据结构——二叉树的遍历(汇总)
二叉树的遍历分为深度优先遍历(DFS)和广度优先遍历(BFS) DFS遍历主要有: 前序遍历 中序遍历 后序遍历 一.递归实现DFS Node.java: public class Node { pr ...
- java 文件遍历排序_Java的二叉树排序以及遍历文件展示文本格式的文件树
Java二叉树排序算法排序二叉树的描述也是一个递归的描述, 所以排序二叉树的构造自然也用递归的: 排序二叉树的3个特征: 1:当前node的所有左孩子的值都小于当前node的值: 2:当前node的所 ...
- java二叉树的深度_Java实现二叉树的深度计算
尝试不同方法求二叉树的深度: 1.depth1,递归计算二叉树的深度,根结点的深度=max(左子树的深度,右子树的深度) + 1. 2.depth2,访问左结点,如有右结点则压栈1,同时把右结点的深度 ...
- java二叉树怎么初始化_java实现二叉树常见操作
packagecom.xk.test.struct.newp;importjava.util.ArrayList;importjava.util.LinkedList;importjava.util. ...
- java jlist 设置高度_java – 根据内容展开JList行高
也许有最容易和最好的方式,我认为 JTable与一个TableColumn(并且没有TableHeader)在所有情况下都更好如 JList,这是你的 Render MacOX version 那么输 ...
- java数字转中文_Java程序:输入数字转换成中文输出
功能看似简单,但真正实现起来也不是易事 现在贴出代码,欢迎各位幕友提出建议!! package test01; import java.util.Scanner; public class Test ...
- java创建读取文件_Java实现文件的创建、读取、写入操作-Fun言
在日常的开发中,对文件的操作经常会有,所以今天教大家其中一种使用Java实现文件的创建.读取.写入操作 创建文件String filenameTemp = "D:\demo.txt" ...
最新文章
- TypeScript基础入门 - 接口 - 继承接口
- 如何利用远程桌面连接CentOS的Desktop版本
- 什么时候需要用到RCC_APB2Periph_AFIO--复用IO时钟的使用
- OpenCV训练分类器
- 书籍推荐-记这几年看的书
- javascript犀牛书_犀牛书作者:最该忘记的JavaScript特性
- python中decode的用法_python中list怎么使用decode方法设置编码
- 泛型:了解泛型与通配符
- C++入门教程(23)深度优先,广度优先(连连看判断是否可以消除)
- 饭后Android 第四餐-BRVAH(最好用的数据适配器)(BRVAH简介,使用方法,item的点击事件,列表加载动画,添加头部、尾部,自定义ViewHolder)
- Cannot convert a symbolic Tensor (simple_rnn/strided_slice:0) to a numpy array. 报错 (解决方法)
- python项目实战:实现王者荣耀敏感词汇过滤器
- 【抓包】【Mac Charles】局域网无法抓包 手机热点来解决
- 什么叫死区时间_死区时间
- 位图字体生成工具 BMFont汉化版
- 社群运营中品牌化和IP化运营实践
- 解决 Client.Timeout exceeded while awaiting headers或Docker Pulling fs layer net/http: TLS handshake的方案
- POJ - 3264
- POBPM集成-数据过滤
- 图像配准(image registration)与图像融合(image fusion)
热门文章
- 有初学的同学问你为什么Java的main方法必须是public static void?请告诉ta!
- leetcode 561. 数组拆分 I(Java版)
- 【Python】Flask框架系列(一):安装、页面跳转/重定向、模板、逻辑语句、过滤器、继承/使用block、url链接/加载静态资源
- 【算法设计与分析】流水作业调度问题 动态规划算法与代码实现 超详细
- 分布式文件系统HDFS解析
- Microsoft SQL Azure论文笔记
- Redis随笔Jedis、jedisCluster的使用
- spring注解式参数校验
- kotlin学习之嵌套类和内部类(六)
- [leetcode] 53.最大子序和