java实现简单二叉树

二叉树基本知识:

一、树的定义

树是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合。

img

树具有的特点有:

(1)每个结点有零个或多个子结点

(2)没有父节点的结点称为根节点

(3)每一个非根结点有且只有一个父节点

(4)除了根结点外,每个子结点可以分为多个不相交的子树。

树的基本术语有:

若一个结点有子树,那么该结点称为子树根的“双亲”,子树的根称为该结点的“孩子”。有相同双亲的结点互为“兄弟”。一个结点的所有子树上的任何结点都是该结点的后裔。从根结点到某个结点的路径上的所有结点都是该结点的祖先

结点的度:结点拥有的子树的数目

叶子结点:度为0的结点

分支结点:度不为0的结点

树的度:树中结点的最大的度

层次:根结点的层次为1,其余结点的层次等于该结点的双亲结点的层次加1

树的高度:树中结点的最大层次

森林:0个或多个不相交的树组成。对森林加上一个根,森林即成为树;删去根,树即成为森林。

二、二叉树

1、二叉树的定义

二叉树是每个结点最多有两个子树的树结构。它有五种基本形态:二叉树可以是空集;根可以有空的左子树或右子树;或者左、右子树皆为空。

img

2、二叉树的性质

性质1:二叉树第i层上的结点数目最多为2i-1(i>=1)

性质2:深度为k的二叉树至多有2k-1个结点(k>=1)

性质3:包含n个结点的二叉树的高度至少为(log2n)+1

性质4:在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2+1

3、性质4的证明

性质4:在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2+1

证明:因为二叉树中所有结点的度数均不大于2,不妨设n0表示度为0的结点个数,n1表示度为1的结点个数,n2表示度为2的结点个数。三类结点加起来为总结点个数,于是便可得到:n=n0+n1+n2 (1)

由度之间的关系可得第二个等式:n=n00+n11+n2*2+1即n=n1+2n2+1 (2)

将(1)(2)组合在一起可得到n0=n2+1

三、满二叉树、完全二叉树和二叉查找树

1、满二叉树

定义:高度为h,并且由2h-1个结点组成的二叉树,称为满二叉树

img

2、完全二叉树

定义:一棵二叉树中,只有最下面两层结点的度可以小于2,并且最下层的叶结点集中在靠左的若干位置上,这样的二叉树称为完全二叉树。

特点:叶子结点只能出现在最下层和次下层,且最下层的叶子结点集中在树的左部。显然,一棵满二叉树必定是一棵完全二叉树,而完全二叉树未必是满二叉树。

img

面试题:如果一个完全二叉树的结点总数为768个,求叶子结点的个数。

由二叉树的性质知:n0=n2+1,将之带入768=n0+n1+n2中得:768=n1+2n2+1,因为完全二叉树度为1的结点个数要么为0,要么为1,那么就把n1=0或者1都代入公式中,很容易发现n1=1才符合条件。所以算出来n2=383,所以叶子结点个数n0=n2+1=384。

总结规律:如果一棵完全二叉树的结点总数为n,那么叶子结点等于n/2(当n为偶数时)或者(n+1)/2(当n为奇数时)

3、二叉查找树

定义:二叉查找树又被称为二叉搜索树。设x为二叉查找树中的一个结点,x结点包含关键字key,结点x的key值计为key[x]。如果y是x的左子树中的一个结点,则key[y]<=key[x];如果y是x的右子树的一个结点,则key[y]>=key[x]

img

在二叉查找树种:

(1)若任意结点的左子树不空,则左子树上所有结点的值均小于它的根结点的值。

(2)任意结点的右子树不空,则右子树上所有结点的值均大于它的根结点的值。

(3)任意结点的左、右子树也分别为二叉查找树。

(4)没有键值相等的结点。

要求:将一个数组中的数以二叉树的存储结构存储,并遍历打印。

import java.util.ArrayList;
import java.util.List;public class bintree {public bintree left;public bintree right;public bintree root;
//    数据域private Object data;//    存节点public List<bintree> datas;public bintree(bintree left, bintree right, Object data){this.left=left;this.right=right;this.data=data;}
//    将初始的左右孩子值为空public bintree(Object data){this(null,null,data);}public bintree() {}public void creat(Object[] objs){datas=new ArrayList<bintree>();//        将一个数组的值依次转换为Node节点for(Object o:objs){datas.add(new bintree(o));}
//        第一个数为根节点root=datas.get(0);
//        建立二叉树for (int i = 0; i <objs.length/2; i++) {
//            左孩子datas.get(i).left=datas.get(i*2+1);
//            右孩子if(i*2+2<datas.size()){//避免偶数的时候 下标越界datas.get(i).right=datas.get(i*2+2);}}}
//先序遍历
public void preorder(bintree root){if(root!=null){System.out.println(root.data);preorder(root.left);preorder(root.right);}
}
//中序遍历public void inorder(bintree root){if(root!=null){inorder(root.left);System.out.println(root.data);inorder(root.right);}}
//    后序遍历public void afterorder(bintree root){if(root!=null){System.out.println(root.data);afterorder(root.left);afterorder(root.right);}}public static void main(String[] args) {bintree bintree=new bintree();Object []a={2,4,5,7,1,6,12,32,51,22};bintree.creat(a);bintree.preorder(bintree.root);}
}

要求:从键盘输入数,存为二叉树结构并打印。

import java.util.Scanner;public class btree {private btree left,right;private char data;public btree creat(String des){Scanner scanner=new Scanner(System.in);System.out.println("des:"+des);String str=scanner.next();if(str.charAt(0)<'a')return null;btree root=new btree();root.data=str.charAt(0);root.left=creat(str.charAt(0)+"左子树");root.right=creat(str.charAt(0)+"右子树");return root;}public void midprint(btree btree){
//        中序遍历if(btree!=null){midprint(btree.left);System.out.print(btree.data+"  ");midprint(btree.right);}}public void firprint(btree btree){
//        先序遍历if(btree!=null){System.out.print(btree.data+" ");firprint(btree.left);firprint(btree.right);}}public void lastprint(btree btree){
//        后序遍历if(btree!=null){lastprint(btree.left);lastprint(btree.right);System.out.print(btree.data+"  ");}}public static void main(String[] args) {btree tree = new btree();btree newtree=tree.creat("根节点");tree.firprint(newtree);System.out.println();tree.midprint(newtree);System.out.println();tree.lastprint(newtree);}
}

输出结果:

des:根节点
a
des:a左子树
e
des:e左子树
c
des:c左子树
1
des:c右子树
1
des:e右子树
b
des:b左子树

1
des:b右子树
1
des:a右子树
d
des:d左子树
f
des:f左子树
1
des:f右子树
1
des:d右子树
1
a e c b d f 先序
c e b a f d 中序
c b e f d a 后序

二叉树的遍历次序:

前序顺序是根节点排最先,然后同级先左后右;中序顺序是先左后根最后右;后序顺序是先左后右最后根。

例如:

img

比如上图二叉树遍历结果

前序遍历:ABCDEFGHK

中序遍历:BDCAEHGKF

后序遍历:DCBHKGFEA

分析中序遍历如下图,中序比较重要(java很多树排序是基于中序,后面讲解分析)

img


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

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

相关文章

HashMap 学习笔记

1.HashMap 的类继承关系 图示即为 Map 相关类的继承关系。源码中的类签名如下: public class HashMap<K,V> extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable {...... }2.HashMap 的底层存储结构 HashMap 的底层存储结构是 Node 类,…

十大经典排序算法动画与解析(配代码完全版)

排序算法是《数据结构与算法》中最基本的算法之一。 排序算法可以分为内部排序和外部排序。 内部排序是数据记录在内存中进行排序。 而外部排序是因排序的数据很大&#xff0c;一次不能容纳全部的排序记录&#xff0c;在排序过程中需要访问外存。 常见的内部排序算法有&…

Java创建并执行线程的四种方法

Java创建并执行线程的四种方法 java里面创建线程有四种方式&#xff1a; 无返回&#xff1a; 实现Runnable接口&#xff0c;重写run();继承Thread类&#xff0c;重写run(); 有返回&#xff1a;实现Callable接口&#xff0c;重写call(),利用FutureTask包装Callable&#xff0c…

idea中svn的更新、检出、提交操作

一、首先集成svn到idea 点击号连接svn仓库地址 等待代码下载完毕后就可以对代码进行update,commit操作了 更新操作方法一:项目上右键 方法二:点击快捷图标 方法三: 代码提交 方法一 方法二: 方法三: 会跳出窗口: 然后点击Commit 如果检测代码有错误会询问你是否要处理,一般确定…

判断链表是否相交并找出交点

问题概述 单链表定义如下&#xff1a; public class ListNode {int val;ListNode next;ListNode(int x) {val x;next null;}}编写程序&#xff0c; 找出两个链表的交点。 如图所示&#xff0c;链表 A 和链表 B 在节点 8 处相交。 算法思路 首先确定一个事情&#xff1a; …

兄弟3150cdn更换硒鼓_耗材知多点:一体式硒鼓及分离式硒鼓

相信第一次接触硒鼓的小伙伴们&#xff0c;会比较诧异为什么有些硒鼓可以直接装机使用&#xff0c;而有些硒鼓&#xff0c;却需要两个部件组合起来或分别装机才能正常使用。今天就带大家来了解一下什么是一体式硒鼓&#xff0c;什么又是分离式硒鼓。①一体式硒鼓&#xff1a;以…

Java IO流之PrintStream分析

简介 PrintStream继承了FilterOutputStream.是"装饰类"的一种,所以属于字节流体系中(与PrintStream相似的流PrintWriter继承于Writer,属于字符流体系中),为其他的输出流添加功能.使它们能够方便打印各种数据值的表示形式.此外,值得注意的是: 与其他流不同的是,Prin…

bs4爬取的时候有两个标签相同_10分钟用Python爬取最近很火的复联4影评

《复仇者联盟4&#xff1a;终局之战》已经上映快三个星期了&#xff0c;全球票房破24亿美元&#xff0c;国内票房破40亿人民币。虽然现在热度逐渐下降&#xff0c;但是我们还是恬不知耻地来蹭一蹭热度。上映伊始《复联4》的豆瓣评分曾破了9分。后来持续走低&#xff0c;现在《复…

RabbitMQ 基本概念与高级特性

文章目录1. 什么是消息队列1.1 消息队列概述1.2 使用消息队列的优势1.3 使用消息队列的劣势1.4 常见的消息队列产品对比2. RabbitMQ 基本概念2.1 RabbitMQ 概述2.2 RabbitMQ 的概念模型2.2.1 Message2.2.2 Publisher2.2.3 Exchange2.2.4 Binding2.2.5 Queue2.2.6 Connection2.2…

HTTP 和 SOCKET 的区别

HTTP 和 SOCKET 的区别 要弄明白 http 和 socket 首先要熟悉网络七层&#xff1a;物 数 网 传 会 表 应&#xff0c;如图1 如图1 HTTP 协议:超文本传输协议&#xff0c;对应于应用层&#xff0c;用于如何封装数据. TCP/UDP 协议:传输控制协议&#xff0c;对应于传输层&…

java 8进制串转中文_为什么不能用中文进行编程?而英文就可以

前些天大雄无意间听见几个线下班小伙伴说真的是无(te)意(di)的“我要补英文”“对&#xff0c;英文真的很重要”“如果编码用中文就好了”...听见这大雄就不淡定了中文代码小伙伴确定能够搞懂&#xff1f;&#xff1f;首先我们大概的看一下中文编码&#xff1a;你以为会写中文写…

MATLAB学习笔记(一)求解三阶微分方程

一、求解三阶微分方程 对于多变量三阶微分方程求解问题&#xff0c;这里介绍一种求解方法。 例题如下&#xff1a; 对于以上方程&#xff0c;给定边界条件&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#xff0c;。求解和的表达式。 二、解题步骤 &#xff08;1&…

axure 内部框架内容下滑_Axure教程:转盘抽奖交互原型

本文跟大家分享&#xff0c;如何使用axure制作转盘抽奖交互原型&#xff0c;不带登录流程。效果如下&#xff1a;抽奖流程一、主要内容(1)主要元件&#xff1a;动态面板(2)重点&#xff1a;旋转交互、随机函数、触发动作。(3)难点&#xff1a;通过停止位置判断抽奖结果(4)涉及函…

日志打印的8种级别(很详细)

日志打印的8种级别&#xff08;很详细&#xff09; 日志的输出都是分级别的&#xff0c;不同的设置不同的场合打印不同的日志。下面拿最普遍用的Log4j日志框架来做个日志级别的说明&#xff0c;其他大同小异。 Log4j的级别类org.apache.log4j.Level里面定义了日志级别&#x…

identity_insert 如何改为on_十分钟教你如何快速提高Laya构建速度,还不快来康康?...

前言如何快速提高Laya构建速度 微信小游戏推出之后&#xff0c;很多公司也相应的进入到微信小游戏这个领域&#xff0c;现在市场上的游戏开发引擎&#xff0c;如Cocos、Egret、Laya都对小游戏有了很好的兼容性。而在实际开发中&#xff0c;如何提高Laya的构建速度&#xff0c;是…

二下语文书电子课本_小学生语文成绩好,不是靠补课,把课本吃透,才是高效学习方法...

关注语文教学发展&#xff0c;解决语文学习困惑。对于基础差、语文学习能力差的同学&#xff0c;我不建议去补课。但是家长说&#xff0c;不补课怎么办呢&#xff1f;我们也没有时间和耐心去给孩子辅导&#xff0c;又怕讲错了&#xff0c;还是让老师讲好。尽管家长们有这个意识…

Java面试——MyBatis系列总结

文章目录&#xff1a; 1.MyBatis是什么&#xff1f; 2.JDBC编程有哪些缺陷&#xff1f;MyBatis又是如何改进的&#xff1f; 3.MyBatis与Hibernate的区别在哪&#xff1f; 4.MyBatis的优缺点 5.请说说MyBatis的工作原理 6.MyBatis的架构设计是怎样的&#xff1f; 7.#{}和…

Java面试——Spring系列总结

文章目录&#xff1a; 1.什么是Spring&#xff1f; 2.Spring由哪些模块组成&#xff1f; 3.Spring中都用到了哪些设计模式&#xff1f; 4.什么是Spring IOC容器&#xff1f;有什么作用&#xff1f; 5.Spring IoC的实现机制 6.BeanFactory 和 ApplicationContext有什么区别…

Spring bean 不被 GC 的真正原因

概述 自从开始接触 Spring 之后&#xff0c;一直以来都在思考一个问题&#xff0c;在 Spring 应用的运行过程中&#xff0c;为什么这些 bean 不会被回收&#xff1f; 今天深入探究了这个问题之后&#xff0c;才有了答案。 思考点 大家都知道&#xff0c;一个 bean 会不会被回…

vts传感器采取船舶的_详解虎门大桥监测系统:传感器与物联网功不可没

来源&#xff1a;传感器专家网近日&#xff0c;虎门大桥“虎躯一震”给全国人民来了个“深呼吸”。虎门大桥是广东沿海地区重要的交通枢纽&#xff0c;始建于1992年&#xff0c;1997年通车至今&#xff0c;大桥一直都十分平稳。但在5月5日下午&#xff0c;虎门大桥发生异常抖动…